摘要

生物中了“急速”之类的效果时,面板上的速度会变大。如果状态估计不知道这个临时加成,就会误以为对手带了加速度的装备或技能。生物面板下方有一行小圆形的状态图标,前一轮已经能找到这些图标并读出右下角的小数字(角标),但还不知道每个图标代表哪个效果。游戏资料模块已经导出了游戏安装目录里的 149 个状态图标文件。

本实验把截图里的图标和安装图标做模板匹配。标签不靠人工逐张标,而是利用玩家把鼠标悬停在图标上时弹出的提示文字:提示第一行是效果名,可以对上安装数据。最终的“两阶段”匹配在没有被悬停的图标上给出正确候选 362/379(95.5%),每个图标约 8.7 毫秒,并已作为截图路由器 v3 的生物状态行读取。随后发现:选择方法和尺度时用到的数据包含测试池录像,甚至包含两段本应“不调阈值”的冻结评估录像,所以这个数字不是盲测成绩。

要回答的问题

  1. 没有被悬停的状态图标,能否仅凭外观认出是哪个效果?
  2. 图标右下角的数字是什么含义(剩余回合还是层数)?

数据与来源

  • 来自另一批采集(B159)的 51 段录像中的生物面板帧(整帧 OCR 加复核用 JPEG)。用前一轮的标题配准和九槽扫描:3116 帧中配准 2333 帧,在 1339 帧里找到 2699 个状态图标。另有 101 帧当时因录像名含中文导致保存静默失败,后来补抓了 107 帧,本次统计在补抓之前。
  • 悬停标签 313 个:提示框首行恰好是某个效果名,其下说明与安装说明模板吻合(723 条中 719 条对上)。提示框居中在被悬停图标的上方:在 115 个“整行只有一个图标”的帧上,图标中心 x 减去效果名左端 x 为 211±2 像素,据此在多图标帧里也能确定是哪一格。这些图标右下角压着鼠标指针。
  • 传播标签 379 个:同一录像、同一格、3 秒内、同一行图标数,且当时没被悬停(一般没有指针)。
  • 同一面板的连续帧不是独立样本;标签没有逐像素人工复核。

方法

安装图标本身先整理。 149 个文件里有 6 组逐字节相同,还有一批是同一幅画的重复导出(40×40 平均灰度差 <1.5)。合并后只有 111 种可以区分的外观,所以身份按“等价类”报告,需要靠悬停文字或上下文再细分。另有几对很像但不相同(差 2–5,例如急速与“适应:速度”)。194 个图标名里有 45 个在资源文件里找不到同名图片。

匹配。 把安装图标按透明度合成到黑底(游戏里的圆框内部是暗色),在多个缩放比例下在裁剪区域内找最佳位置与尺度;“正确”指第一名的等价类包含标签图标。比较了四种 OpenCV 模板匹配方式。

两阶段(实时用)。 先用 20×20 缩略图在固定尺度 0.66 下挑出最近的 12 个类,再只在 0.64/0.66/0.68 三个尺度上做带透明度遮罩的平方差匹配。

设置

尺度范围先用 0.44–0.62,发现正确匹配有 607/619 停在上限 0.62,于是扩到 0.56–0.84;正确匹配的最佳尺度集中在 0.64–0.68(0.66 最多,213 次)。

结果

方式 悬停(有指针) 传播(一般无指针)
第一版,按单个图标计 237/313 —
彩色归一化相关,无遮罩,按等价类 282/313 343/379
归一化互相关,透明度遮罩 270/313 345/379
平方差,透明度遮罩 271/313 348/379(91.8%)
归一化相关,透明度遮罩 280/313 342/379
扩大尺度后单阶段 — 353/379(每个图标 385 毫秒)
两阶段 — 362/379(95.5%),每个图标 8.7 毫秒

被悬停的图标本来就有提示文字,身份应直接用文字;图标匹配主要服务于没被悬停的图标。

生产读取器核对(路由器 v3 的生物状态行,在 558 个有标签的帧上):

悬停标签 传播标签
标签格找到图标 313/313 379/379
读到悬停说明且效果与标签一致 313/313 —
候选第一名等价类正确 290/313 362/379
角标原文读到 205/313 343/379

558 帧全部读取成功;每帧中位 177 毫秒、p95 213 毫秒(不含整帧 OCR,OCR 复用路由器已有的一次读取)。真实路由进程中,冷启动首帧 13 秒,之后每帧 0.6–1.6 秒。在一段 18 张截图的完整 App 回放中,3 张生物面板都带上状态行,其中一张认出了悬停的效果。

角标含义。 只用“这一行只有一个图标”的无歧义悬停(111 个图标、23 种效果):例如急速刚施放 8 次都是 4(安装数据:持续 2 回合,另有每层加成)。结果与规则模拟器一侧从游戏原生代码确认的“角标 = 该效果实例的剩余回合(含时长加成,截到上限)”一致,没有反例。

失败与负结果

  • 传播标签的 31 个错例: 5 个是标签本身错(那一格已换成另一个效果,匹配其实对了);7 个被鼠标指针遮挡;5 个是差值 <5 的近似图标对;14 个是“反魔法”被认成“龙血”——两者都是带星的盾牌,只在盾牌下方两小段花纹上不同,游戏里约 38 像素大小时几乎看不清。
  • 第一次生产核对只有 227/379: 资料接口给的是 RGBA,模块误当成 BGR;修正通道顺序后与实验一致。
  • “角标像层数”的结论作废。 最初的统计把一帧中唯一的悬停提示挂到了这一行所有图标上,于是其它效果的角标被错算给被悬停的效果。原图核对后,被悬停效果的角标都在安装上限以内;按全部图标分组得出的那张表和“更像层数”的判断撤回,原输出保留。
  • 数据卫生问题。 2699 个图标中有 1158 个来自测试池的 12 段录像,其中 446 个来自两段登记为“不训练、不调阈值”的冻结评估录像;另有一段晚间测试池录像也参与了开发。等价类阈值、匹配尺度和“无指针时约 93–95%”都是在含这些录像的数据上选出和统计的,所以这两段冻结录像对本方法已不能再称“冻结”,95.5% 也不是测试池上的盲测成绩。

局限

  • 弱标签没有逐像素人工复核;连续帧高度相关。
  • 结果是“等价类候选”,不是确认的状态;相似图标对仍需第二阶段细分。
  • 以后用这批测试录像评状态行读取,必须注明不是盲测;真正的盲测要用新录、只进测试池的录像。

结论与下一步

没被悬停的状态图标可以按等价类在几毫秒内认出来,被悬停的直接读提示文字;两者都只是候选。角标的含义是剩余回合。感知侧只报告角标原值,含义由规则模拟器和游戏资料决定。后续可以做相似图标对的放大比对、检测并屏蔽鼠标指针,并把补抓的帧加入重跑;状态行的身份候选再交给状态估计,在推断构筑前扣除临时效果。