Skip to content

Session 回放与时间轴

Perfowl 的 Session 是追加写入的事实流。时间轴是从事实流派生出的回放坐标,供指标曲线、截图、标注、窗口筛选和导出共享;它不会覆盖或重新排列原始事件。

适用范围

  • 输入NormalizedPerformanceEventhostReceiveMonotonicNswallTimestamp 与原始追加序号 ordinal
  • 输出:每个事件的 elapsedSeconds、点质量、Session 时间轴质量和可选持续时长。
  • 当前阶段:P4 基础能力,E2 构建与测试证据;未代表真实设备截图或逐帧回放已经闭环。

坐标计算

首选:Host monotonic clock

当 Session 中每个事件都有大于 0 的 Host monotonic 接收时间时,取首事件作为锚点:

text
anchorNs = first.hostReceiveMonotonicNs
elapsedSeconds = (event.hostReceiveMonotonicNs - anchorNs) / 1_000_000_000

monotonic 值小于锚点的事件不产生负时间;该事件标记为 out-of-order,时间轴质量降级为 degraded。正常单调事件点标记为 valid

兼容旧归档:wall clock fallback

只要 Session 中有任一事件的 monotonic 字段为 0,就对整个 Session 统一使用 wall clock,避免在一条时间轴中混合两种时钟:

text
wallAnchor = first.wallTimestamp
elapsedSeconds = max(0, event.wallTimestamp - wallAnchor)

该坐标可用于回放但不是单调时钟真值,所有点标记为 estimated,时间轴质量为 estimatedDate 差值非有限时保持空值。

空值与持续时长

  • 没有事件:时间轴质量为 missing,点列表为空,持续时长为空。
  • 无法计算坐标:elapsedSeconds = null,保留事件和质量原因,不写入 0
  • durationSeconds 是可用 elapsed 坐标的最大值,不把缺失点或 wall clock 之前的负差值算入时长。

回放排序与窗口

playbackPoints 是派生排序,不改变 points 的 raw 追加顺序:

  1. 有 elapsed 坐标的点按 elapsedSeconds 升序;
  2. elapsed 相同按原始 ordinal 升序,保证稳定回放;
  3. 坐标缺失的点排在有坐标点之后,并仍按 ordinal 保序。

窗口查询使用播放坐标的闭区间:

text
points(in: start...end)

只返回 elapsedSeconds 存在且落在 [start, end] 内的点;缺失坐标不会被误纳入窗口。

质量语义

质量含义展示建议
validmonotonic 坐标可用且事件顺序单调正常回放
estimated使用 wall clock 兼容坐标展示“估算时间轴”标识
out-of-order单点 monotonic 早于前一事件或锚点保留点,标记异常
degraded时间轴存在乱序点,但仍有可回放坐标允许复查,报告提示降级
missingSession 为空或没有任何可用坐标展示空态与原因

这些状态与指标自身的 warmupmissingcounter-resetsuspect-static 等质量语义正交:时间轴可用不代表某条指标一定有值,指标有值也不改变时间轴质量。

版本与证据

算法版本session-timeline.v1
实现SessionTimelineBuilder
证据E2:Swift 49/49,通过单调、乱序、fallback、窗口和空 Session 测试
真机状态尚未完成 E4 截图 / 逐帧源闭环

后续演进

  • Session Store 建立持久化回放索引,导出原始时钟、锚点、算法版本和时间轴质量。
  • 截图事件、用户标注和 Note 使用同一 elapsed 坐标,避免按墙上时间二次猜测。
  • 接入 DVT Graphics / xctrace 逐帧记录后,复用此坐标层挂载 FrameTime、Jank 候选和报告游标;候选值继续携带来源与证据等级。

版本历史

版本日期变更
v12026-09-04发布 Session 回放时间轴的时钟选择、公式、排序和质量语义

来源批次:P4 Session Review 时间轴基础

Perfowl · Performance Observer