TC官方合作论坛

 找回密码
 立即注册
查看: 2105|回复: 5

[讨论] 普及知识:是什么导致脚本闪退?(经验分享)

[复制链接]
发表于 2014-1-29 14:39:11 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 badcwytga 于 2014-1-29 14:40 编辑

近日 写了一个 某游戏的 挂机脚本   功能 分别为 打怪 捡物 回位
脚本调试通过     可以正常的 打怪 捡物 回位    脚本运行一段时间后  脚本居然闪退了。
本人就是一新手  让我找这么一些 暗病 我无能为力  经过我自己一番努力无果,唯有请教 论坛里的 RainShine 大神。

RainShine 说:无限的递归会导致脚本占资源暴涨,且运行时间长了会闪退。
吖呀 我滴妈呀,什么递归 看不懂!有木有?。 后来 RainShine 远程帮我讲解  我就开窍了  
想起当时 真都是想到 头在爆开了! 现在问题解决了  我也发个贴 让和我一样的新手们 避免这种问题的发生。下面 我发出 源码 让大家看一下。
下面源码 红色字体 是 RainShine 讲解所在 说白了 就是 线程里 自己调用自己!

功能 初始化()
    是否成功=辅助.注册插件("rc:dm.dll",真)
    如果(!是否成功)
        辅助.消息框("插件注册失败")
    如果结束
// 大漠注册
    dm.SetPath(help.getrcpath("rc:"))
    字库=dm.SetDict(0,"游戏.txt")
// 设置字库
功能结束

功能 开始挂机()
    dm.MoveTo(501,317)
    辅助.等待(100)
    dm.RightDown()
    辅助.等待(1000)
    dm.RightUp()
   挂机脚本.自动捡取()

    //还是这个线程,去执行捡东西.
    //然后挂机又执行捡取....无限调用无限执行 无限深入   这才导致脚本占用内存飙升  然后导致……闪退.就这么简单.自己改改就ok
功能结束

功能 自动捡取()
    个数=列表框.得到个数("列表框0")
    Q=0
    遍历(i=0;i<个数;i++)
        Q++   
        AA=列表框.获得文本("列表框0",i)
        名字=字符串.截取(AA,0,3)
        如果(名字=="宝石类")
            KK=列表框.获得文本("列表框0",i)
            BB=字符串.修剪(KK,"宝石类=")
            物品名字=字符串.修剪(BB,"|")
            x,y,识别x,识别y
            捡物=dm.FindStrFast(0,0,1030,800,物品名字,"ffcc19-101010",0.9,x,y)
            如果(x>-1)
                //////////////
                dm.MoveTo(x+20,y+20)
                辅助.等待(100)
                dm.LeftClick()
                辅助.等待(600)
                ///////////////
                辅助.等待(100)
                识别=dm.FindStrFast(x,y,x+150,y+20,物品名字,"ffcc19-101010",0.9,识别x,识别y)
                如果(识别x>-1)

                    挂机脚本.自动捡取()
                    //仍然是这个线程,自己调用自己 也就是递归调用 又执行 如果一直是这种情况 就会出不来 一层一层地深入 导致闪退.
                否则
                    辅助.等待(100)
                    挂机脚本.移动坐标()

                    //如果是这种情况 或者下面的那种情况 就执行移动.
                如果结束
            否则
                辅助.等待(100)
                dm.KeyPress(18)
                辅助.等待(100)
                如果(Q>6)
                    挂机脚本.移动坐标()
                如果结束
            如果结束
        如果结果
遍历结束
功能结束


功能 移动坐标()
// 这块源码 内容过大 暂不写出来了
//写重点
//最后回位后 调用自动打怪
    挂机脚本.开始挂机()
    //还是这个线程  又执行挂机
功能结束

下面来个总结
看到我的源码 :自动打怪 - 调用 自动捡取-检测是否捡物成功-如果成功-调用回位-否则-调用自动捡取-
错误就在红色字体这里 :检测捡物不成功 就调用自动捡物  这句就是在 自己调用自己  然后回位 又调用挂机  挂机线程里 再一次的调用了自动捡物 重复了N次
结果就是: RainShine 说的 无限的递归会导致脚本占资源暴涨,且运行时间长了会闪退。

特别感谢!RainShine 的帮忙  
在此 祝大家新年快乐 马到功成  TC论坛越办越好!



评分

参与人数 2威望 +20 金币 +20 收起 理由
kevinqq + 10 + 10
rainshine + 10 + 10 赞一个!加油!

查看全部评分

回复

使用道具 举报

发表于 2014-1-29 14:50:52 | 显示全部楼层
又学到了点东西,感谢分享
回复 支持 反对

使用道具 举报

发表于 2014-1-29 15:01:06 | 显示全部楼层
来支持下!
回复

使用道具 举报

发表于 2014-1-29 15:36:47 | 显示全部楼层
{:soso_e127:} 以前我也是这样调来调去,不过现在基本不会这样调用。

这样的调用是会带来内存猛涨,结果脚本自动崩溃。
回复 支持 反对

使用道具 举报

发表于 2014-1-29 18:11:09 | 显示全部楼层
{:soso_e117:}好雷人的逻辑...
怎么想的这么调,拜服中.表示从来不曾想过这么调用函数
回复 支持 反对

使用道具 举报

发表于 2014-1-29 22:53:13 | 显示全部楼层
自己调用自己干嘛不写个循环,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-9-24 03:45 , Processed in 0.046122 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表