- 小学六年级
- 550381
- 141
- 0
- 10 朵
- 261 个
- 163 个
- 3700
- 2010-11-30
|
1#
t
T
发表于 2021-11-12 13:52
|
|只看楼主
思路: 1.选取游戏中连续变化的几个点为依据来判断是否卡屏 2.使用GetPixelColor函数获取这几个点的颜色 3.把各个点的颜色作为字符串合成一段特征值 4.实时获取几个点的颜色,对比特征值 5.如果特征值在指定时间一直未变则判断卡屏 6.判断卡屏后进行后续的操作例子:
以TAPTAP为例
1.TAPTAP首页中该方框为视频,连续变化中,选取三个点存入表用作检测并获取特征码
- Dim 卡点检测点 = {{174,376},{565,377},{120,525}}
- Function 卡屏点取值()
- //检测卡点,生成特征码
- Dim str = ""
- For i = 1 To CInt(UBOUND(卡点检测点)) + 1
- str = str&GetPixelColor(卡点检测点[i][1],卡点检测点[i][2])
- Next
- 卡屏点取值 = str
- End Function
复制代码 2.1 定义一个初始的特征码用作对比,设置一个定时器和检测时间 2.2 定义一个变量判断卡屏次数,并设定误判上限值,防止程序误判- Dim 初始卡屏点取值 = 卡屏点取值()
- Dim 卡屏检测定时器 = TickCount()
- Dim 卡屏检测时间 = 10*1000
- Dim 检测到卡屏次数 = 0,卡屏误判上限 = 3
复制代码 3.写一个函数来判断卡点- Function 卡屏判断程序()
- Dim 卡屏比对取值 = 卡屏点取值()
- //特征值不一样则重置检测时间,重置卡屏次数
- If 初始卡屏点取值 <> 卡屏比对取值 Then
- 卡屏检测定时器 = TickCount()
- 检测到卡屏次数 = 0
- 初始卡屏点取值 = 卡屏比对取值
- TracePrint "未发现卡死,辅助稳定运行中"
- End If
- //前后两个特征值一样并超过了卡屏检测时间则判断卡屏一次
- If TickCount() - 卡屏检测定时器 >= 卡屏检测时间 Then
- 初始卡屏点取值 = 卡屏点取值()
- 检测到卡屏次数 = 检测到卡屏次数 + 1
- TracePrint "检测到卡屏次数:"&检测到卡屏次数
- //卡屏次数大于误判上限则判断为卡屏,并执行后续操作
- If 检测到卡屏次数 >= 卡屏误判上限 Then
- 检测到卡屏次数 = 0
- Call 卡屏操作()
- End If
- 卡屏检测定时器 = TickCount()
- End If
- End Function
复制代码 4.发生卡屏进行后续操作,重启应用- Function 卡屏操作()
- //检测到卡屏后重启应用
- ShowMessage "检测到卡屏,准备重启游戏", 1000:TracePrint "检测到卡屏,准备重启游戏"
- Delay 1000
- Dim app包名 = "com.taptap"
- KillApp app包名
- Delay 1000
- RunApp app包名
- ShowMessage "已重启完毕,等待进入游戏", 3000:TracePrint "已重启完毕,等待进入游戏"
- Delay 3000
- End Function
复制代码 完整代码:- //可添加任意个检测点,点数越少运行效率越高
- Dim 卡点检测点 = {{10,10},{50,50},{100,100},{150,150},{200,200}}
- Dim 初始卡屏点取值 = 卡屏点取值()
- Dim 卡屏检测定时器 = TickCount()
- Dim 卡屏检测时间 = 10*1000
- //调整卡屏误判上限值,防止程序误判
- Dim 检测到卡屏次数 = 0,卡屏误判上限 = 3
- Function 卡屏判断程序()
- Dim 卡屏比对取值 = 卡屏点取值()
- If 初始卡屏点取值 <> 卡屏比对取值 Then
- 卡屏检测定时器 = TickCount()
- 检测到卡屏次数 = 0
- 初始卡屏点取值 = 卡屏比对取值
- TracePrint "未发现卡死,辅助稳定运行中"
- End If
- If TickCount() - 卡屏检测定时器 >= 卡屏检测时间 Then
- 初始卡屏点取值 = 卡屏点取值()
- 检测到卡屏次数 = 检测到卡屏次数 + 1
- TracePrint "检测到卡屏次数:"&检测到卡屏次数
- If 检测到卡屏次数 >= 卡屏误判上限 Then
- 检测到卡屏次数 = 0
- Call 卡屏操作()
- End If
- 卡屏检测定时器 = TickCount()
- End If
- End Function
- Function 卡屏点取值()
- //检测卡点,生成特征码
- Dim str = ""
- For i = 1 To CInt(UBOUND(卡点检测点)) + 1
- str = str&GetPixelColor(卡点检测点[i][1],卡点检测点[i][2])
- Next
- 卡屏点取值 = str
- // TracePrint "卡屏点取值:"&str
- End Function
- Function 卡屏操作()
- //检测到卡屏后重启应用
- ShowMessage "检测到卡屏,准备重启游戏", 1000:TracePrint "检测到卡屏,准备重启游戏"
- Delay 1000
- Dim app包名 = "设置重启包名"
- KillApp app包名
- Delay 1000
- RunApp app包名
- ShowMessage "已重启完毕,等待进入游戏", 3000:TracePrint "已重启完毕,等待进入游戏"
- Delay 3000
- End Function
- //放在主线程中循环判断或放在子线程中实时监测
- Function main()
- Do
- Delay 100
- Call 卡屏判断程序()
- Loop
- End Function
- Call main()
复制代码
|