摘要

战斗记录 App 在玩家玩游戏时不断截取画面,但不能每一帧都送去识别(一次完整读取要一两秒)。它先用关键帧服务挑出“值得读”的画面,再按场景和预算决定送不送读。问题是:很多有价值的画面只出现很短的时间——点开一个生物面板看一眼,可能只停留 0.5–1 秒;鼠标悬停时的攻击预览也一闪而过。

外部审阅会话转来用户的任务:检查并优化战前准备、布阵及战斗开局的信息采集机制。本实验先做真值时间线,再审计现状,然后逐步改动并用端到端回放验证。

要回答的问题

在一局真实对战中,每一段有价值的画面(生物面板、英雄面板、法术书、日志、攻击预览、结算页等)有没有被 App 真正读到?如果没有,是“根本没采集”还是“采到了但没送读”?

数据与来源

  • 只用用户选定的训练录像:10 月 10 日 16:57 训练局(前 23 分钟),后来加上 10 月 10 日 01:39 训练局和 10 月 9 日 08:38 官方 AI 训练局做独立检查。没有使用冻结或留出数据。
  • 真值时间线(并行助手完成,模型目视核对 MODEL_VISUAL_CHECKED,不是人工审核):每 0.5 秒抽一帧,布阵和战斗段每一帧都看过。16:57 局共 148 段:
类型 段数 其中只出现 1–2 帧
战斗中生物面板 24 18
战斗中法术书 22 —
日志 9 —
英雄面板(布阵 2 + 战斗 2) 4 —
布阵生物面板 2 —
攻击预览 55 —

01:39 局另做 246 段真值(战斗生物面板 65 段,其中 29 段 ≤2 帧;法术书 49;日志 12;英雄面板 4;攻击预览 99;结算 1)。

全部测试都是 App 离线视频回放(与菜单“离线视频”同一入口),没有操作用户的游戏或 App。

方法

一、现状审计(改动前)

App 的采集链路:关键帧服务对每一帧用学习型选帧器决定关键帧,再用“阶段门”(phase gate)给出场景;App 按场景决定是否送读,每种场景有固定间隔,与上次读过的画面相比变化格子少于 10% 算重复;会话读取预算 58 次。另有行动条、攻击预览等“旁路读取”(不占会话预算的独立读取通道)。

阶段 机制 审计发现
选秀 全部判为跳过 按设计不读;“全部确定”页 1/1 读到
布阵 英雄面板间隔 120 秒 12 个英雄面板关键帧只读了 2 个,漏掉宝物套装和技能的悬停说明
开战 新场景第一帧不受间隔限制 开战后立即读,没有 40 秒盲区
战斗中法术书 间隔 45 秒 42 个关键帧只读了 7 个,漏掉变化后的魔法消耗
战斗中生物面板、日志 间隔 0 被会话预算挤掉;短面板常常根本没有关键帧
结算画面 判为菜单跳过 没读

用户担心的“40 秒间隔”只用于普通战场画面;真正的盲区来自英雄面板 120 秒、法术书 45 秒的间隔和会话预算。

二、改动(都在既有机制上扩展)

  1. 英雄面板、法术书的间隔改为 0,仍保留重复判断。
  2. 信息页如果因预算、预留或队列挤出读不了,改走旁路读取,结果作为额外帧进入状态估计(SE)。排队顺序:行动条 → 预览 → 信息页 → 普通关键帧。
  3. 重复判断按“一次打开”计:同一页关掉再打开,就重新读一次。
  4. 关键帧服务每 0.5 秒对 App 标记的帧跑一次阶段门,给出场景线索(2 Hz,每帧约 16 毫秒),补上选帧器没决定的短面板。
  5. 法术书和日志要等画面静止(前后两个线索样本是同一页且画面重复)才读;整次打开都没静止,就在关闭时读一个样本。生物面板和英雄面板仍立刻读(很多只出现 1–2 个样本)。
  6. SE 请求的帧数上限从 256 放宽到 1024。

设置

严格计数:区间内(前后各留 0.5 秒)有一次读取,且路由器在那次读取里真的定位到了该页面,才算读到。各次回放(e2e-11 到 e2e-20)对应依次加入的改动。

结果

16:57 局,改动逐步加入(严格计数):

画面(区间数) 改动前 +间隔 0 和信息页旁路 +每次打开读一次和场景线索
布阵英雄面板(2) 1 2 2
战斗生物面板(24) 8 12 22
战斗英雄面板(2) 1 2 2
日志(9) 7 9 9
法术书(22) 7 13 22
攻击预览(55) 40 40 39
结算(1) 0 0 0

但代价很大:旁路信息页读取从 16 次增到 102 次,其中 23 次只读到战场(法术书开合动画、翻页、面板淡入淡出),回放墙钟 921 → 1971 秒。

加入“等静止”(改动 5)后:旁路信息页读取 102 → 47,其中只读到战场的 23 → 3;回放墙钟 1971 → 1445 秒;法术书 22 → 21(一个回归:书关了半秒又打开,被当成上一次打开的重复;已修,下一次回放回到 22/22)。

离线模拟在 01:39 真值上独立检验“等静止”规则:

规则 信息页读取 生物面板 法术书 日志
线索即读 423 65/65 49/49 12/12
全部等静止 223 62/65 49/49 12/12
只有法术书和日志等静止(采用) 264 65/65 49/49 12/12

与 16:57 结论一致:法术书和日志等静止不丢区间、省约四成读取;生物面板等静止会丢面板。

后续回放(16:57 局):

严格计数 e2e-17(2 Hz) e2e-18(4 Hz 线索) e2e-20(+读最静止的样本)
战斗生物面板 23/24 24/24 24/24
法术书 22/22 20/22 22/22
日志 / 英雄面板 / 布阵 / 开战 / 结算 全部 全部 全部
攻击预览 51/55 51/55 51/55

e2e-20 是这一局所有真值页面类型第一次全部读到。结算页读取接入后,两局真实结算读数共 56/56 个数字与参考一致。

08:38 官方 AI 局(阈值独立于前两局):战斗生物面板 15/15、日志 35/35、法术书 17/17、结算 1/1、攻击预览 26/31。

延迟:e2e-17 加上读取开销修复后,行动条/预览/信息页的排队等待 p95 约为 2.4–2.8 秒,比之前约减半;但两次回放机器负载不同,只算指示性对比。

失败与负结果

  • 4 Hz 线索后法术书退步(22 → 20)。最初以为是两个动画样本隔太近被当成静止,于是加了“至少隔 0.45 秒”的条件——无效(e2e-19 结果完全相同)。逐个看日志才发现真正原因:这两次打开一直没满足静止,关闭时读的是最后一个样本,4 Hz 时那个样本已经是关书动画。撤回静止间隔,改读“最静止的样本”后恢复 22/22。原因判断错误的这一轮照实记录。
  • 08:38 局的 SE 整局失效:开战前 3 次主读取被 App 整页拒绝,因为一个不在竞技场目录里的子技能身份让整页作废,我方英雄与阵营也随之丢失,减员时间线整局为空、结算 14 张卡全部无法对应。修复后(准备页、阵营颜色、离开行动条三项)再回放:我方阵营定出,结算 12 张对应、2 张因两堆开局数量相同分不开。
  • 回放工具在 cp1252 控制台上打印进度时抛异常,结束后不写结果也不退出,20 个进程占约 6 GB,直到手动结束;已修。
  • 一次回放开跑 30 秒就在视频解码报异常,单独读同一视频正常,原因未定,保留为未关闭故障。
  • 01:39 局里攻击预览线索的最高分常落在一个固定位置(雪地里的敌方狮鹫),会盖住同帧的真预览;两局都只有约 72% 的预览被及时读到,因为规则要求连续两个采样过阈值,而很多预览只出现 1–2 个采样。
  • 只显示 0.3–0.5 秒的生物面板,2 Hz 线索可能只采到淡入淡出帧(e2e-13 漏 2/24)。

局限

  • 真值是模型目视核对,0.5 秒网格,短于 0.5 秒的面板可能漏标。
  • 01:39 局参与过线索阈值和策略的选择,在它上面的结果只算跨录像开发回归。
  • 离线回放会等旁路读完;实时模式(真正玩游戏时)的收益和延迟都还没测,部分回放还与其他任务并行,延迟数据不干净。
  • 已决定但未送读的画面只在内存里,App 中途退出会丢;旁路读取的原图读完就删,回看时打不开。

结论与下一步

采集盲区主要不是“画面太快”,而是固定间隔和预算这些人为规则;把信息页移到旁路、按“一次打开”去重、加场景线索和等静止规则后,16:57 训练局的页面类型全部读到,且读取量可控。外部审阅建议把指标分三层:采到页面 → 字段读对 → SE 正确消费;下一步是在空闲机器上测延迟、在实时模式下验证(需用户同意),并改进攻击预览线索(给多个峰、把读不出预览的位置记为景物、首次出现一个采样就读并允许重读一次)。