摘要

战斗画面上有一条行动条,按行动顺序列出各兵堆的小卡片。为了认出每张卡片是哪种生物,程序把卡片和一个模板库(每种生物 8 个变体:不同尺寸、是否镜像)逐一做带掩码的模板匹配(OpenCV 的 matchTemplate)。此前一次真实性能剖析显示:同一常驻进程里,热匹配累计 19.51 秒,占战场读取器的 98.71%。

静态分析发现一个可能的浪费:模板库保存的 RGB 模板其实是从 RGBA 图像切出来的“视图”,每个像素占 4 字节步长,内存不连续;同一个模板会被每张卡片重复使用,OpenCV 的 Python 绑定可能每次都要先把它重新打包成连续数组。本实验的唯一改动是:在构造模板库时,把每个 RGB 模板一次性物化成连续的 uint8 数组。

结果:3 个合成软件检查证明匹配结果逐位不变;唯一一次小型微基准中,16 次热匹配累计耗时从 0.5584 秒降到 0.5396 秒,减少约 3.37%。这只是一个很小的正观察,真实游戏和端到端的收益未知。

要回答的问题

把模板一次性存成连续数组,能否在不改变任何匹配结果的前提下减少热匹配耗时?

数据与来源

  • 只用内存中合成的小模板库:三个有效实体(其中两个像素完全相同,用来制造并列)加一个透明 / 被过滤的实体,原有 8 个变体和原生 RGB 尺寸。不读写 PNG,不使用真实游戏图、游戏资料库、模型或 OCR。
  • 此前那次真实剖析的测量额度(3 次)已用完,本实验不重开,也没有新的真实测量。

方法

生产代码改动: 只在模板库构造时把 oriented[:, :, :3](RGBA 的 RGB 视图)替换为 np.ascontiguousarray(oriented[:, :, :3]),每个变体一次。掩码仍由原 RGBA 生成;尺寸、镜像、模板库、构造与匹配函数的签名、默认值、阈值和匹配代码都不变(匹配函数的语法树严格相同)。不另建缓存、不保存第二套模板库。

三组软件检查:

  1. 原“非连续”与新“连续”构造的像素、掩码、变体元数据相同;四种配置、两张裁图的全部带掩码匹配响应——包括有限值的位,以及 NaN / ±Inf 的位置——严格相等,完整排名 JSON 无误差相等。另用探针观察到实际交给 OpenCV 的模板像素步长从 4 变为 3、连续性从 false 变为 true。
  2. 并列与退化情况:重复实体按名称排序、镜像命中、低掩码过滤、top 参数和错误路径都保持;额外用人为控制的响应验证正分的镜像 / 尺度并列仍选原来的首个变体(这不是自然图像结果)。
  3. 两个工作线程共享只读快照:两线程都参与、共享原数组、结果与串行一致,关闭后线程和引用都释放。

微基准: 在用户的战斗记录 App 退出、确认没有其他项目进程后,只运行一次预先写好的命令,不换顺序、不重复挑好结果。同一份内存 RGB,先跑“非连续”再跑“连续”,各一个阶段:每阶段构造一次、首次匹配一次、热匹配 16 次。共 34 次排名、816 次带掩码的底层调用。串行单线程,OpenCV 底层线程数 24 保持不变。

设置

项目 设置
迭代 每种布局 1 次首次 + 16 次热匹配
线程 Python 串行;OpenCV 24 线程
计时 构造、首次匹配、热匹配分开记录;JSON 校验不计入每次匹配计时

结果

软件检查:3 项通过,0 失败 / 错误 / 跳过(pytest 1.27 秒)。

微基准(秒 / 次数):

指标 非连续(对照) 连续
构造 0.0032340 0.0030293
首次匹配 0.0378078 0.0343698
16 次热匹配累计 0.5584393 0.5396449
热阶段壁钟(含 JSON 检查) 0.5589921 0.5401396
热阶段实际带掩码调用 384 384
每次匹配中非连续的模板输入 24 0

热匹配快了 1.0348 倍,即减少约 3.37%;每次匹配后检查完整 JSON 相等,两种布局结果严格一致。两种布局的逻辑 RGB 模板字节数都是 595,332(这不是进程内存实测)。整个命令壁钟 1.494 秒,退出码 0。

失败与负结果

  • 收益很小。热匹配仍是主要耗时,本改动没有减少匹配的调用次数或规模。
  • 测量期间没有连续采样系统进程;之后得知有另一项解码任务可能在附近时间开始,因此不能证明全程没有短暂的资源竞争。没有因为可能的噪声而重测。
  • 隐藏在绑定层里的拷贝次数和耗时没有直接测量,只用探针证明了输入连续性。

局限

  • 单次测量、固定顺序、极小的模板库,受缓存、顺序和噪声影响;不支持“稳定提速”、全模板库收益、p95 或 App ≤3 秒的结论。
  • 没有真实游戏图的测量;真实收益需要另批独立的测量协议和时间窗口。

结论与下一步

改动保留:它不改变任何结果,并在小型合成测量中有一个小的正观察。但它不能解释 19.5 秒热匹配的主要部分,要显著提速仍需减少匹配规模或换算法。真实收益要另行批准独立测量。