如何在OR条件判断中识别触发项并优化Humanbenchmark瞄准训练Bot速度?
优化方案:合并条件判断+提升扫描速度
一、解决合并OR条件后无法判断触发项的问题
可以将像素值与对应坐标打包成元组列表,遍历这个列表完成匹配检查,既实现了逻辑合并,又能直接获取触发条件对应的坐标,代码更简洁高效:
def scan(colors, width, height, start_x=66, start_y=231, stop_x=1900, stop_y=838): # 直接获取内存中的截图,跳过磁盘IO步骤 im = auto.screenshot() color_set = set(colors) # 转成集合提升查找效率 additive = round(height / 2) x_range = stop_x - start_x y_range = stop_y - start_y for x_step in range(0, math.ceil(x_range / width)): base_x = start_x + width * x_step for y_step in range(0, math.ceil(y_range / height)): base_y = start_y + height * y_step # 打包像素与对应坐标,统一处理 pixel_coords = [ (im.getpixel((base_x, base_y)), (base_x, base_y)), (im.getpixel((base_x, base_y + height)), (base_x, base_y + height)), (im.getpixel((base_x, base_y + additive)), (base_x, base_y + additive)) ] # 遍历检查,找到匹配项直接返回结果 for pixel, coord in pixel_coords: if pixel in color_set: return coord[0], coord[1] # 未找到目标时返回默认值(可根据实际需求调整) return (0, 0)
二、核心性能优化点
1. 移除磁盘IO开销
原代码将截图保存到本地文件再读取,这是最大的性能瓶颈之一。直接使用auto.screenshot()返回的内存图像对象,跳过磁盘写入读取步骤,能大幅降低单次调用耗时。
2. 将colors转为集合
集合的成员检查操作in是O(1)时间复杂度,远快于列表的O(n)。如果colors包含多个颜色值,这一优化能显著减少每次像素检查的时间。
3. 提前终止扫描
瞄准训练测试通常同时只有一个目标,因此一旦找到第一个匹配的坐标,立即返回结果,无需继续扫描整个区域,避免无意义的计算。
4. 减少重复计算
将start_x + width * x_step、start_y + height * y_step这类重复计算的结果存入变量,避免在getpixel和坐标生成时重复运算,节省CPU资源。
5. 简化循环结构
去掉原代码中嵌套的for i in range(len(colors))循环,直接通过集合检查像素是否匹配,减少循环层数,提升代码执行效率。
额外可尝试的优化方向
- 使用
mss库替代现有截图工具:它的屏幕捕获速度远快于pyautogui,适合实时性要求高的场景。 - 缩小扫描区域:如果目标只会出现在固定范围内,调整
start_x/start_y/stop_x/stop_y的取值,减少需要扫描的像素总量。
内容的提问来源于stack exchange,提问作者Minestone
相关产品推荐
相关产品推荐

