外观
2026-10-28 · 第二轮对照试用增量
第二轮代码核对确认:在FrameLifetime尚未激活的兼容路径,曲线实际可来自Graphics的CoreAnimationFramesPerSecond;旧会话未记录逐点来源时,不根据Registry 标签冒认FrameLifetime。新Session逐点写入metricSources和metricAlgorithms:Graphics用graphics.CoreAnimationFramesPerSecond / graphics-core-animation-fps.candidate.v1;真实FrameLifetime用activitytracetap.FrameLifetime / activitytrace-framelifetime-window-fps.v1,激活后缺失不回填Graphics。报告与CSV保留来源切换,两个来源的均值不解释为同一独立物理参考。静态页低刷新不直接等于卡顿。来源标签修复属于E2软件证据,第二轮真机覆盖与数值可信度由Owner实测确认。
正式55/66、11项暂停不变。本批软件/主机证据不是新增真机验收。第二轮方案与实现。
FPS:屏幕新画面的产生速率
2026-11-02 · 统一为“每秒实际呈现帧数”,静止秒记 0
- 定义:每秒 FPS = 该秒内实际呈现的新画面帧数(与 PerfDog 一致:其每秒 FPS 之和等于总帧数)。工作台、原生报告、Excel 共用这一口径;只有拿不到逐帧数据时才用 Graphics
CoreAnimationFramesPerSecond兜底并标注来源。 - 静止:iOS 26 FrameUpdate 帧链首尾相接时,静止秒的 FPS 记 0,曲线不断。实时判定依据为 ActivityTrace 流的设备时间水位已越过最后一帧 1 秒以上(
activitytrace-window-fps.watermark-idle.v2);水位不前进(流沉默)时仍为stale-source,不补 0。报告中按“首帧为 0 点的整秒”计数,被断链覆盖的秒不计入(不当 0)。 - 静止秒数占比:FPS 为 0 的秒数占比,与平均 FPS 一起显示,用于区分“画面静止”与“卡顿”。
- 报告中的 Avg/Median/Std/Var/FPS≥18/FPS≥25/MedRange/Drop(FPS) 基于上述每秒帧数(
per-second-frame-count.v1)。与 PerfDog 同一帧序列比较时,因整秒切分起点不同(Perfowl 以首帧为 0 点,PerfDog 以其时钟整秒),数值接近但不逐位相同;以 PerfDog 每秒帧数为输入时统计完全一致。方案与实现
ios.foreground.fps 描述目标 App 位于前台时,屏幕在最近时间窗内实际产生了多少个新的 presentation 。它是 Display Performance 的吞吐指标,不是刷新率,也不是单帧 FrameTime 的倒数。
2026-10-16 · 内部177受控静态/动画专项
静态帧显示专项 · 2026-10-16(E4):内部177/自有Lab90.21.7完成五个全新正常UI轮,每轮静止→动画→静止→动画→静止。共5290条实际FrameLifetime、658个发布样本;两动画段FPS/FrameTime最小有值率100.0%、恢复最大573.0ms,五轮中文静态提示均实际可见(每轮三次预定取样、保留全部结果)。本地帧全消费、零drop/undrained、正常Stop durable成立。静止仍可空,不补零/旧值;不是独立物理精度校准。历史Build73成果保留,本专项不改全指标已验收数量;其他指标不自动开测。结果与范围。
当前来源与历史范围
FrameLifetime历史专项E4结论保留;新Session实际来源需看逐点source/algorithm,Graphics兼容路径不再借用FrameLifetime公式标签。本轮是来源合同修复,不新增物理精度结论。
1. 定义 / 概念
FPS 回答的是:
在目标 App 位于前台的有效时间窗里,出现了多少个新的显示 presentation?
如果页面完全静止,没有任何新内容需要显示,那么 0 FPS 可以是一个正确结果;它不自动代表性能异常。
2. Scope 与 Unit / 单位
| 字段 | 合同 |
|---|---|
| metricID | ios.foreground.fps |
| Scope | foreground-device |
| Unit / 单位 | frames-per-second |
| definitionVersion | activitytrace-framelifetime-window-fps.v1 |
FrameLifetime 事件由系统 compositor 发出,不是目标 PID 的私有计数。因此只有目标 App 确认位于前台时,当前 presentation 才能进入这条 FPS 曲线。
3. 系统服务 / 底层服务
当前新 Session 通过:
text
com.apple.instruments.server.services.activitytracetap
→ onlySignposts
→ com.apple.coreanimation / IOMFBServer / FrameLifetime采集调用 / 命令实现由 ActivityTraceFrameLifetimeRawAdapter 基于 pymobiledevice3 ActivityTraceTap 打开 DTX stream;DisplayPerformanceProjector 维护 FPS 滑动窗口。
4. 公式 / 计算方式
当前正式公式是 trailing 1 秒 presentation count:
text
FPS(t) = count(valid presentationTimestamp in (t-1s, t])
/ actualWindowSeconds窗口尚未完整建立时按实际有效窗口长度计算并保留 warmup 语义。
为什么不是 1000 / FrameTime
FrameTime 描述一对相邻 presentation 的间隔;FPS 描述整个时间窗口的 presentation 吞吐。一个窗口里可以同时出现 16ms、16ms、80ms 等不同 FrameTime,因此单帧倒数不能代表这一秒的实际 FPS。
5. 静态页面的理论 0 与当前实现的空值
2026-10-16 校订:真正静止允许没有新 presentation,但“没有收到帧”不等于“完整观察到零帧”。当前实现没有独立的帧流完整水位,不能只根据连接存在、其他指标更新或主机时间经过就认证零帧窗口。此前本节将理论条件直接写成当前保证,现收窄,数值公式不变。
只有 source 观察完整、App 仍在前台且最近一秒确无新 FrameLifetime 时,窗口旧事件淘汰后的 0 才有依据。Host Monotonic 只能辅助窗口淘汰,不能证明设备事件已经全部送达:
text
理论允许:已证完整的零帧窗口 → FPS = 0
当前保守实现:无帧超过主机新鲜度窗口 → null / stale-source
同钟最后帧过老:null / stale-device-source
禁止:用 host 时间合成新的 presentation timestamp
禁止:用 host 时间生成 FrameTime因此:
text
independently complete observation + foreground + zero presentations
→ 理论上允许 FPS = 0(当前未实现独立完整性认证)
source unavailable
→ FPS = missing6. FPS 与 Refresh Rate
例如:
text
Refresh Rate = 60Hz
FPS = 20fps完全可以同时成立。60Hz 表示显示系统当前刷新率约为 60Hz;20fps 表示最近一秒只出现了约 20 个新的 presentation。静态页、视频、主动降帧动画和系统刷新策略都可能造成两者不同。
7. Quality / missing
FPS 至少区分:
valid:窗口、前台归因与 source 都成立;warmup:source 已有事件,但窗口刚建立;candidate-idle:历史设计标签;当前无帧沉默不据此产生 0;stale-source:最后帧的主机到达时间已过观察窗;静止与迟到尚未区分,不等于连接断开;stale-device-source:同钟最新系统点与最后帧的间隔下界超过 2 秒;仅说明最后帧老,不独立证明丢帧或断链;not-foreground:目标 App 不在前台;missing:source 不可用或没有足够事实确认窗口状态。
sourceEpoch、reconnectGeneration、foreground transition 或 display identity 改变时,窗口需要清空并重新建立。
8. 证据与当前边界
已验证的 iOS 17 FrameLifetime POC 在 5 秒内得到 90 条真实 FrameLifetime,并且整条 ActivityTrace 流约 0.03696 MiB/s。这证明逐帧事实源真实存在且带宽低;它不等于所有 iOS 版本的 FPS 产品链已经 E4。
当前还需继续关闭 iOS 15/16/18、前后台切换、长稳、ProMotion 与完整 R7 产品 start/stop 门禁。
9. 如何分析 FPS
FPS 最适合回答“这个持续动画/滚动场景有没有持续地产生新画面”。推荐同时看:
text
FPS
+ Refresh Rate
+ FrameTime / P95
+ Jitter
+ 业务是否应该持续更新不要把固定的 58.5 / 55 FPS 直接当作所有设备、120Hz 场景、静态页或视频的统一发布阈值。更可靠的是同设备、同刷新策略、同脚本的历史版本回归。
10. 历史 Graphics FPS
第一代 FPS 来自 graphics.opengl 的 CoreAnimationFramesPerSecond 周期 gauge,约 1Hz,适合快速观察但无法恢复逐帧 FrameTime、P95 或真实 refresh_interval。当前 Registry 已经切到 ActivityTrace FrameLifetime;旧 Graphics FPS 只保留为历史 Session、受控对照或兼容背景。
完整切源过程见 Display Performance 技术演进与实验。
11. 版本历史
| 版本 | 日期 | 修订要点 |
|---|---|---|
| 静态语义澄清(公式不变) | 2026-10-16 | 区分零帧与未收到帧;撤回静态必回 0 的实现保证。E2 静态诊断 8 项通过;一次现有包 E4 低活动观察不代替受控静态/动画验收。诊断。 |
| current-display-device-lag-lower.v1 | 2026-10-04 | 同钟过期下界>2s置空/stale-device-source,数值公式不改;22匹配/全量E2与b116安装E3通过,新真机E4未测、54项100%仍partial。G7。 |
| v7(当前) | 2026-09-17 | 按当前 Registry 重写:ActivityTrace FrameLifetime 成为现行 FPS source;补 trailing window、idle=0、quality 与证据分层。 |
| v6 | 2026-09-17 | 仍以 Graphics 为当前 source、FrameLifetime 为目标 source 的迁移期说明。 |
| v1 | 2026-09-04 | 首次发布 FPS 指标说明。 |
继续阅读:Display Performance 总览 · FrameTime · Refresh Rate。
2026-10-04 · 当前窗的设备时钟过期保护
同一已核Session/目标代际/重连且两源实测Mach timebase一致,lagLowerNs=max(0,sysmontap.EndMach−FrameLifetime.endMach)×numer//denom是过期下界,不是精确年龄。严格超过2s时,本实时Display指标置空、质量stale-device-source;age上界未知继续null。下界小/无钟不是当前新鲜证明,原host-silence、one-shot、warmup与缺值门保持。旧Raw和native历史数值不回填,完整当前窗/独立scope与五轮100%仍待新包验收。
版本历史增量:current-display-device-lag-lower.v1(原数值公式不改),E2同钟/代际/边界及原迟到数据离线对照通过,E4与全54可信目标仍partial。共享时钟定义 · G7实施与证据。
版本历史增量:2026-10-16 · 内部177静态提示/动画恢复专项G五新轮E4通过;5290实际FrameLifetime、658发布样本,缺值保留不补零或旧FrameTime;同时修复关闭快照竞态,零本地drop/残留且正常Stop durable。不是全指标或独立物理精度通过。完整范围与失败保留。
Owner复测 Update · 2026-10-16
Owner已确认内部177静态画面自测OK;沿用原五轮静止/动画/恢复的限定E4范围,空缺不补0或旧帧间隔。不将本次复测重复计为新指标,不覆盖历史Build73成果。收口与后续。
2026-10-26 · 静帧专项如何复现与解释
静止10秒、30Hz动画15秒、静止10秒、动画15秒、静止10秒,静止停用CADisplayLink与周期UI;每轮在预定三个静止时点读取界面,保留全部取样,不能重试挑选。内部177五新轮共5,290条FrameLifetime、658发布样本,两段动画最小有值率100%,每轮至少一次静态中文说明实际可见。静止可缺值,未建立设备零帧窗口完整性;恢复最大观测估计572.952ms含时钟桥误差,不当精密时延校准。
定位先核前台/刺激、源年龄与实际FrameLifetime,再核decoder/消费者/封存。连接存活和本地零drop都不足以把静止空值补成0。专项E4及Owner确认沿用,不重测、不增加66项计数;跨系统、ProMotion及完整产品长稳门独立保留。原五轮与失败保全。
版本历史增量:2026-10-26,补静帧实验复现、预定取样和恢复误差边界;公式/实现不变,本批为E1文档复盘。月度复盘与来源索引 · 实验判断方法
版本历史增量:2026-10-28,第二轮内部试用口径、来源及报告边界更新;E2/E3与待测E4分列。第二轮方案与实现。