玩家只有打开面板或把鼠标移到目标上,才能看到某些数值。AI 也应该从这些画面获取信息,而不是直接读取模拟器的隐藏状态。第一步是把“这一帧识别到了什么”定义清楚。
已经实现的 ui-element-observation.v1 把单帧证据交给下游,同时保留未知状态和来源。它不是完整游戏状态,也不负责决定哪个按钮能按。
flowchart LR
A[Source frame] --> B[Perception]
B --> C[Typed observation]
C --> D[Strict wire reader]
D --> E[Causal inbox]
E --> F[Consumer view]
图 1:这条已交付链路验证观测传递与时间边界,不代表识别准确率或完整游戏执行已经通过验证。
1. 接口传什么,不传什么?
| 内容 | 含义 |
|---|---|
| 帧与本次观察的引用 | 同一像素可以重做识别,每次结果仍有自己的标识 |
| 对象候选与数值 | 身份或角色候选;整数、范围、百分比、文字或未知 |
| 状态与覆盖情况 | 成功、模糊、不可读等;检测了什么,不是世界里有什么 |
| 来源、坐标与时间 | 从哪里看到、何时产生、何时到达;缺失不能补成确定值 |
内部检测器数据、引擎对象 ID、合法行动和点击许可不会随意穿过这个接口。百分比是画面显示的百分比点,可以小于零或超过一百;检测器置信分数也不自动等于校准后的概率。
2. 看到攻击力 0,和没看清有什么区别?
假设截图里有一个攻击力字段。识别成功读到 0,输出的是已观察到的整数零;文字模糊,则输出不可读和未知值。检测器还可以保留 NO_TEXT 或 UNPARSEABLE 等具体原因,供回看原始证据。
对象标识只属于本次观察。下一帧又出现一个叫 attack 的局部对象,并不能证明它还是同一名英雄。这个关系需要后续解释与追踪层判断,Perception 不代做结论。
3. 为什么接收时间和原图坐标都不能猜?
旧截图的 OCR 可能处理得慢,晚于新截图到达。接收端按真实到达时间限制 AI 能使用的证据,再按截图时间判断新旧;不能因为旧结果最后到,就把它当成当前画面。离线回放记录不会自动变成实时输入。
坐标也一样。只有字段来源、原图尺寸和整图输入范围明确一致时,才把归一化框转换成原图像素。没有绑定或只有局部裁图时,位置保持未知。即使有框,它也只是观测位置,不是安全点击区域。
另外,不同视频都可能有一张叫 frame-a 的图。调用方需要分配不含答案信息的会话内帧引用;接收端会拒绝把同一引用绑定到冲突的来源。它检查元数据一致性,不宣称证明像素完全相同。
4. 测试证明了什么?
端到端合同测试覆盖:旧 Perception 结果导出、严格格式读写、未知值不变成零、内部字符串不泄漏、来源绑定、旧帧延迟、离线隔离和依赖保留。公开入口与依赖测试还防止消费方绕开接口去导入检测器内部文件。
这些测试验证的是软件边界;它们不能证明每个画面都识别正确,也不能证明模拟器完全符合原游戏。全套 Perception 测试中另有目录迁移兼容问题,被单独记录,没有被这次接口验收掩盖。
5. 之后由谁接着做?
Perception 可以独立改善识别和现有格式的适配。消费侧获得证据后,再解释当前界面、决定是否值得继续观察,并让执行层逐步操作。新增共享字段或改变时间、坐标、标识含义,要重新做跨模块评审。
规范源是代码仓库的 docs/architecture/perception-ui-element-interface-v1.md;本文是可读说明。当前 v1 只接受明确的像素观测和合成测试来源,模拟器的语义 UI 输出还需要单独约定,不能伪装成真实截图识别。
Comments