FrameTime Continuation 解锁与 GPU Counter UI 修复方案
日期:2026-09-16 · 证据:E2 方案与设计契约 · 状态:approved
1. 核心目标与修复原则
- Unified CoreProfile Continuation 解锁:
- 移除
LaunchTraceStreamDecoder.consume() 中针对 coreProfileStreamRole == 'frame-continuation' 的提前 return None。
- 继续使用已有 RAW-v2 parser 状态机连续解析后续 chunk,正常提取
PRESENTED_FRAME_DEBUG_ID 入 _pending_frame_events,通过 take_frame_events() 持续供给实时与持久化流。
- 严禁重新引入 stop/drain/restart CoreProfile rotation,保持 Unified 单 Tap(start=1, restart=0, sourceEpoch=1)。
- 保证 Startup 语义已完成的启动报告不可变冻结,continuation chunk 事件不得修改本次 App Launch 报告。
- FrameTime Freshness(消除无限重复旧值):
- FrameTime 是事件派生值而非无限保鲜 gauge。自上一个 product sample 以来没有收到新的 Presented Frame 时,
frameTimeMs 置为 None,质量标为 missing-no-new-frame。
- 新 Presented Frame 到达时正常发布最新值与 candidate 质量;静止无新帧页面诚实 missing,禁止重复上一旧值,禁止拿 Graphics FPS 伪装逐帧值。
- GPU Counter 专用面板与单选展示:
- 为 GPU Counter 新增专用
GPUCounterPanel,从通用 MetricPanel 分流,Header 固定只展示卡片名、可用 counter 总数与 整机 · source-native。
- 第一版采用单 Counter 选择模式,提供 Popover/搜索框与单选列表,长名称尾部截断并提供完整 tooltip。
- 图表仅绘制选中的单个 Counter,自适应 Y 轴缩放,彻底消除 24+ 个 readout 挤爆 Header 导致的逐字符竖排与量级压缩。
- 底层
PerformanceSample.gpuCounters、Session 存储与导出保持全量,UI 单选绝不减损底层持久化。