• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.05
软件大小:21.6M
更新时间:07-04

按键精灵安卓版
立即下载

软件版本:3.3.0
软件大小:62.5M
更新时间:5-24

按键精灵iOS版
立即下载

软件版本:1.3.3
软件大小:29.2M
更新时间:06-14

按键精灵Mac版
立即下载

软件版本:1.1.0
软件大小:12.3M
更新时间:12-29

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
发新话题 回复该主题

[按键精灵手机版2.5基础教程] 9.日志、分辨率、多线程 [复制链接]

1#

按键精灵手机版2.5基础教程


9.日志、分辨率、多线程



1. 日志
你辛苦的做完了一个脚本,并且在自己的电脑或者手机上运行完美时,满心欢喜的丢给别人用,却发现各种问题,而对方又无法描述清楚的时候,很着急有没有!别急,你不懂,但是他懂啊----日志,我们打开命令大全看看怎么使用:



只有两个命令,一个开启日志,一个关闭日志。前面说过的TracePrint没忘吧!这个绝对好用啊,请想起来一次用一次,因为日志记录的就是TracePrint的信息,只要在脚本一开始的地方添加Log.Open,结束的地方添加Log.Close,就可以将你脚本中所有的TracePrint的信息记录到一个文本上,你只需要让用户将这个文本发给你,就很方便的找到卡住的地方加以修正。
还是写来测试看看吧:
  1. Log.Open
  2. TracePrint "test"
  3. TracePrint GetTempDir()
  4. Log.Close
复制代码
我们在一开始开启了日志记录,在最后关闭日志记录,中间还有两个TracePrint语句,分别输出字符串和按键精灵安卓版的目录,那么日志文件就是记录这两句输出,我们打开文件管理器,找到日志文件:


打开他,我们可以看到一个含有当前时间的日志文件,我们将它移动至桌面,使用记事本打开就可以看到信息:


如果是想成为按键作者的,请务必使用日志记录啊(亲身经历有木有,没加日志的时候解决问题那叫一个痛苦,满眼都是泪啊)
2. 分辨率
当你辛苦的做完了一个脚本,并且在自己的电脑或者手机上运行完美时,满心欢喜的丢给别人用,却发现各种问题(这段话好眼熟- -),

其中很大的可能性都来自于同一个----分辨率问题。这种情况在模拟器上还好解决,但是到手机上就不好解决,手机分辨率众多,而且游戏也不完全以拉伸方式来填充屏幕。但是没有办法创造办法也要上不是,因此SetScreenScale诞生了,适合用在同一个屏幕比例的设备,比如1280*720与1920*1080都是16:9的屏幕。那么在1280*720的设备上做的脚本,在1920*1080的设备上也大部分能用(如果均用的多点比色,多点找色,并且取点的颜色的位置尽量取大片颜色的正中央,小部分的情况是界面并不以同比例拉伸,这种情况要分开做),不同比例的设备暂时没有好的解决办法,只能不改变逻辑的情况下重新获取颜色坐标写一遍。

如果使用了找图的方式,那么在需要制作多个分辨率的同一个图,不能使用SetScreenScale来自适应。比如我使用720*1280分辨率进行开发,那么就在开头写上:

  1. SetScreenScale 720,1280
复制代码
使用SetScreenScale能节约大量的时间,我们不妨先直接使用,然后写好之后再使用不同分辨率的设备进行调试,界面不是等比例变化的再分开去写。
3. 多线程

相信很多童鞋对那种时不时弹出来的窗口深痛欲绝(网络连接失败之类的)。由于他的不确定性,我们很难在适当的时候去处理他(每个联网的地方都去检测很麻烦不是),那么我们可以用多线程来解决这个问题,多线程相当于多个大脑,可以同时做不同的事情,我们可以一个线程用来运行脚本内容,一个线程用来检测超时,这里我们写个简单的多线程检测:
  1. Dim 检测线程
  2. Thread.SetShareVar "是否卡主", false
  3. 检测线程 = Thread.Start(test_thread)
  4. Do
  5. Delay 500
  6. If Thread.GetShareVar("是否卡主") = true Then
  7. TracePrint "卡着超过10秒,结束线程"
  8. Thread.Stop(检测线程)
  9. TracePrint "退出脚本"
  10. EndScript
  11. End If
  12. Loop

  13. Sub test_thread()
  14. Dim 起始颜色 = GetPixelColor(109,298)
  15. Dim 秒数 = 0
  16. Do
  17. Delay 1000
  18. Dim 结束颜色 = GetPixelColor(109,298)
  19. If 起始颜色 = 结束颜色 Then
  20. 秒数 = 秒数 + 1
  21. If 秒数 > 10 Then
  22. Thread.SetShareVar "是否卡主", true
  23. Exit Do
  24. End If
  25. TracePrint "界面已经" & 秒数 & "秒没变了"
  26. Else
  27. TracePrint "界面变化了,说明脚本还在正常运行"
  28. 起始颜色 = GetPixelColor(109,298)
  29. 秒数 = 0
  30. End If
  31. Loop
  32. End Sub
复制代码
点击运行后,我们发现界面不动的时候就开始不断的计时,一旦变化了,就重新开始计时,当计时超过设置的秒数时,脚本就退出了线程:


脚本的逻辑很简单,我们取一个坐标,不断的判断这个坐标的颜色,如果这个坐标颜色长时间没变,那么我们就认为卡住了。(可以判断多个点提高准确性)。已经大学了,我就不再贴命令大全的图了,学会自己去看吧!

线程的启动停止都好理解,但这里的共享变量使用的方法让我们感到疑惑,我们一开始是用Dim来设置变量的,但是线程却不是,这说明,Dim设置的变量其实只是一个线程的变量,而Thread.SetShareVar才是真正的全局变量。学到了!记下来!

多线程容易造成抢资源,造成手机卡顿,因此使用需要谨慎,使用时可以尽量减少其中一个线程的耗时操作,比如找图找色,最好只用来修改变量。


    已有1评分我要评分查看所有评分

    最后编辑兄弟工程师13 最后编辑于 2015-10-09 16:42:12
    本主题由 按键工程师 兄弟工程师13 于 2015/10/9 16:42:58 执行 移动主题 操作
    2#

    Dim 检测线程
    Thread.SetShareVar "是否卡主", false
    检测线程 = Thread.Start(test_thread)
    Do
    Delay 500
    If Thread.GetShareVar("是否卡主") = true Then
    TracePrint "卡着超过10秒,结束线程"
    Thread.Stop(test_thread)
    最后这行的括号中线程名称是不是 应该是 上边的线程代表的变量 检测线程 不应该是线程打开的子程序

    3#

    看着晕,继续看

    4#

    请教下怎么同时运行多线程。

    Dim xiancheng1,xiancheng2
    xiancheng1 = Thread.Start(xuanzhe1)
    xiancheng2 = Thread.Start(xuanzhe2)

    Sub xuanze1
    TracePrint "选择1"
    End Sub

    Sub xuanze2
    TracePrint "选择2"
    End Sub

    Sub xuanze3
    TracePrint "选择3"
    End Sub


    我想同时启用1,2,1是正常流程一直循环,用xuanze2 来当监控,当出现指定条件的时候关闭xuanze1的sub,在启用xuanze3。
    这个怎么调整了?

    5#

    多线程那里看的蒙蔽,看不懂

    6#

    学习

    7#

    回复 6楼18239729613的帖子

    对,stop括号里应该是线程id

    8#

    很不错咯

    9#

    每天签到

    10#

    小白来学习

    11#

    跪着也要学会

    12#

    回复 1楼兄弟工程师13的帖子

    模拟器的横屏坐标 怎么来写入脚本啊

    13#

    Thread.Stop(test_thread) 改成 Thread.Stop(检测线程)

    14#

    回复 8楼hk2000hk的帖子

    关闭xuanze1的同时 ,start xuanze3不就成了么

    15#

    455456566655

    16#

    66666666666666666

    17#

    签个到,晚点继续看。昨晚了我第一个处女做。自动点击文章阅读。

    18#

    怎么循环运行勒?这个才是关集点,这个代码只能单词运行

    19#

    我写的多线程不稳定 循环1万到两万次左右脚本就会死掉 重新启动脚本又正常运行一段时间后又莫名其妙的停掉。单线程无限循环就不会出现类似问题这是为什么呀

    学习修炼中---------
    20#

    被检测线程运行完毕,检测线程还在运行,只能卡死停止,谁知道检测线程怎么停止,谢谢了

    发新话题 回复该主题