摘要
顶部行动条上每张卡片是一个生物头像。程序要认出头像是 148 种生物中的哪一种:拿每个标准头像(多种尺寸、正反两个朝向、带透明掩码)在卡片附近滑动比较,取最相似的。上一轮把识别质量补齐后,发现读一整张截图要约 19 秒,远超项目“3 秒内”的目标,其中逐卡头像匹配就占 12–13 秒。
本实验只优化速度,不改任何识别规则:在 GPU 上批量算所有模板的相似度,再用原来的 CPU 算法复核排名前几的候选,最终返回与原来完全相同的分数和决定。结果:37 张原图的完整输出与上一轮逐项一致;驻留状态下的显式行动 HUD 整图读取,18 次热调用中位数 1.440 秒、p95 1.505 秒。
要回答的问题
在不改变模板、尺寸、掩码、镜像、搜索位置、身份门槛(分数 ≥0.80 且领先 ≥0.03)和数量规则的前提下,能否把行动卡匹配加速到整图读取在 3 秒以内,并且所有接受/拒判决定不变?
数据与来源
- 23 张稳定行动条原图(289 张卡片)、1 张瞬态图、13 张范围/前景控制图,共 37 张,来自 5 个训练来源组和 2 个旧校准组。旧校准组在上一轮已参与失败诊断,所以这是“已曝光数据回归”,不是新独立来源。最新评估集没有打开。
- 环境:Windows、RTX 5080、Torch 2.13.0+cu130、OpenCV 4.10.0,没有新依赖或新模型。
方法
先试 CPU。 单卡原 24 线程约 1.2 秒,限 1 线程约 0.85 秒;4/8 个 Python 分片约 0.33/0.24 秒,完整排名一致。但每帧有 12–13 张卡,再加内区补读和当前行动者匹配,CPU 路线仍会吃掉大部分预算,所以不采用新的 CPU 并行实现。
GPU 批量 NCC。 NCC(归一化互相关)衡量两张图在去掉亮度和对比度差异后有多像。在 GPU 上完整计算每通道均值、方差和归一化分母(不是只做一次裸卷积),上传/同步/回传都计入时间。12 张卡原始计算约 0.23 秒、内区约 0.30 秒。
为什么还要 CPU 复核。 GPU 分数与 CPU 最大相差约 4.66e-5,24 个身份决定相同,但少数低位几乎并列的候选会交换顺序。所以不直接发布 GPU 近似分数,而是:GPU 评价全部模板 → 用原 CPU 算法复核前三名和邻近竞争者(至少 4 项、数值保护带 0.002)→ 返回原 CPU 的分数、镜像和尺度。近乎常量的窗口、误差越界或截断边界不安全时,退回原完整 CPU 搜索;GPU 设备失败也退回原路径。保护带只用于数值复核,不是新的接受门槛或概率。
加速整条后,又把同一方法用于首卡和底部当前生物头像(保持原 212×160 裁区和 148/158/168 三个模板尺度)。所有中间结果只在同一次读取、同一图对象、同一框内使用,不跨帧缓存,不读人工标签。新路径通过显式开关启用,原默认路径不变。
设置
先直接重读 23 张原图的 289 张卡和 48 次内区补读做匹配一致性检查;再完整读取全部 37 张原图;最后对 3 张稳定原图各做 6 次热调用(共 18 次),包含实际读文件、模型/区域 OCR、进程间通信和新 JSON 保存,不返回缓存结果,不排除较慢的一次。测量期间没有并行运行本任务的测试或其他重负载。
结果
匹配一致性:前三候选、CPU 分数、镜像、尺度与上一轮完全一致。55 份整图输出与上一轮保存结果逐项相同(只忽略计时、新增的执行后端诊断和旧回放标记),身份、数量、颜色、时钟、行动者、其他面板和原始 OCR 都参与比较。
| 37 张图实际读取 | 结果 |
|---|---|
| 稳定行动卡 | 289/289 找到 |
| 身份 | 289 对、0 错、0 未知 |
| 数量 | 288 对、0 错、1 未知 |
| 队色 | 288 对、0 错、1 未知 |
| 同卡三项完整 / 整条完整 | 287/289;21/23 |
| 瞬态帧 | 1 帧 12 张可见卡被跳过,不计正确 |
| 范围/前景控制 | 13 张,无行动卡误读 |
整图耗时:
| 范围 | 耗时 |
|---|---|
| 上一轮两张热整图 | 19.311 / 18.993 秒 |
| 只加速整条、行动者仍用 CPU | 4.345 / 4.357 秒 |
| 整条 + 首卡/底部加速:18 次热调用中位数 | 1.440 秒 |
| 同上 p95 | 1.505 秒 |
| 同上范围 | 1.382–1.505 秒 |
相关 215 项测试全部通过、无跳过,覆盖默认路径、GPU 数值/并列/镜像/尺度、空白退回、错源/错框拒绝、设备失败等。
失败与负结果
- 两个旧的未知保持未知:一张图第 9 张卡的队色、另一张图第 7 张卡的数量“3”。本轮不为它们调门槛。
- GPU 原始分数存在低位近似并列交换,这正是必须加 CPU 复核的原因。
- 37 张图第一次遍历的第一帧仍有 8.878 秒初始化,单列保留,不计入热调用统计。
局限
- 准确率数字来自已曝光的开发回归,不是新增独立准确率或十场对局验收。
- 18 次只是 3 张质量样本的重复性能测量,不是 18 个独立样本。
- 只证明这条驻留的显式行动 HUD 读取路径在这些样例上低于 3 秒,不代表所有场景、所有机器、游戏同时运行时,也不是 Battle App 从热键到显示的时间。App 和公共默认都没改,项目整体 3 秒验收仍未完成。
结论与下一步
把模板匹配搬到 GPU 并用原算法复核排名,可以在不改变任何观察结果的前提下把整图读取从约 19 秒降到 1.5 秒左右。下一步冻结当前接受规则和加速实现,从来源隔离计划中挑选未参与调参的稳定截图,验证完整行动条和当前行动者,而不是继续在同一批图上优化。
Comments