|
|
发表于 2026-1-20 10:23:20
|
显示全部楼层
广东省广州市
.子程序 过hk, 逻辑型
.参数 序号, 整数型
.局部变量 返回值, 文本型
.局部变量 dm, dmsoft ' 取当前线程的dm实例
dm = 线程信息 [序号].dm
' ========== 优化1:缓存hk窗口句柄,避免重复EnumWindow ==========
.如果真 (线程信息 [序号].hk窗口句柄 = 0 或 窗口是否存在 (线程信息 [序号].hk窗口句柄) = 假)
' 枚举hk窗口时加过滤,减少遍历耗时
线程信息 [序号].hk窗口句柄 = dm.EnumWindow (线程信息 [序号].窗口句柄, “”, “Internet Explorer_Server”, 2 + 16)
.如果真 (线程信息 [序号].hk窗口句柄 = 0)
调试输出 (“线程” + 到文本 (序号) + “未找到hk窗口”)
返回 (假)
.如果真结束
.如果真结束
' ========== 优化2:切换前校验窗口,减少无效阻塞 ==========
.如果真 (dm.IsWindow (到整数 (线程信息 [序号].hk窗口句柄)) = 0)
调试输出 (“线程” + 到文本 (序号) + “hk窗口无效,重新枚举”)
线程信息 [序号].hk窗口句柄 = dm.EnumWindow (线程信息 [序号].窗口句柄, “”, “Internet Explorer_Server”, 2 + 16)
.如果真 (线程信息 [序号].hk窗口句柄 = 0)
返回 (假)
.如果真结束
.如果真结束
' ========== 优化3:SwitchBindWindow加超时+非阻塞思路 ==========
' 用线程锁控制切换(避免多线程同时切换dm上下文)
加锁 (全局dm切换锁)
' 切换hk窗口(这里的阻塞无法完全避免,但独立dm实例后会大幅减轻)
.如果真 (dm.SwitchBindWindow (到整数 (线程信息 [序号].hk窗口句柄)) = 1)
调试输出 (“线程” + 到文本 (序号) + “切换到hk窗口成功”)
脚本延时 (序号, 200) ' 缩短延时(500→200),减少等待
' ========== 优化4:YOLO识别轻量化 ==========
dm.AiYoloUseModel (0)
' 缩小识别区域(16,68,320,232 → 只识别hk区域,减少计算)
返回值 = dm.AiYoloDetectObjects (16, 68, 200, 180, 0.9, 0.5) ' 提高置信度,减少计算量
.如果真 (返回值 ≠ “”)
' 处理hk识别逻辑
调试输出 (“线程” + 到文本 (序号) + “hk识别成功:” + 返回值)
.如果真结束
' 切回游戏窗口(独立dm实例+锁,切回不会阻塞)
dm.SwitchBindWindow (线程信息 [序号].窗口句柄)
.如果真结束
解锁 (全局dm切换锁)
返回 (真) |
|