外观
P3 TinyJank / Smooth 产品闭环阶段结果
本批结论
TinyJank(/10min)已按公开 SmallJank / 微卡顿规则实现,并与历史SmallJank(/10min)复用同一次判定,不重复计数。Smooth已实现为 Perfowl 自有透明候选:相对中位 FrameTime 的归一化均方根偏差;公式可复算,但不宣称与 PerfDog 数值等价。- Python、Swift、29 Stat、64 项 Registry、自校准、Foundation Delivery、工作台说明与站点已完成同批贯通。
- Registry 静态
Unsupported从 2 项降为 0;输入不足或采集条件不满足时仍输出 missing,不补 0。 - iOS 17/18 已接受的 E4 CoreProfile 源可回放生成两个指标;由于现有窗口很短,只证明链路成立,不用于制定阈值或宣称外部一致性。
完整定义、采集源、公式和质量语义见 Frame Time 与流畅度权威页。
冻结算法
设第 i 个有效呈现帧间隔为 FT[i],单位为 ms,前三个有效间隔均值为 B[i]。
TinyJank
text
B[i] = mean(FT[i-3], FT[i-2], FT[i-1])
TinyJank[i] = FT[i] > 2 * B[i] AND FT[i] > 1000 / 24 ms
TinyJank(/10min) = TinyJankCount / durationSeconds * 600- 公式版本:
tiny-jank.perfdog-public.v1。 SmallJank是兼容别名,与 TinyJank 同值。- 阈值按
1000/24 = 41.666666… ms计算。 - 前三段只建立动态基线;没有正测试时长时速率为 missing。
Smooth
text
M = median(FT)
e[i] = (FT[i] - M) / M
Smooth = 100 * sqrt(mean(e[i]^2))- 公式版本:
perfowl-smooth.robust-rms.candidate.v1。 - 越低越稳定;恒定 60 Hz 与 120 Hz 序列的合法结果均为 0。
- 至少 4 个有效 FrameTime;短窗口输出 missing。
- 长帧不裁剪,避免严重卡顿被隐藏。
- 该公式是 Perfowl candidate;PerfDog 公开材料未给出
f(X,p,hp)的完整参数,现阶段不套用竞品阈值。
实现范围
| 层 | 结果 |
|---|---|
| Python FramePipeline | 新增精确 TinyJank 阈值、TinyJank 兼容投影与 Smooth 计算 |
| Swift FramePipeline | 与 Python 使用同一公式、常量和短窗口门禁 |
| 29 Stat | TinyJank(/10min) 与 Smooth 从 Unsupported 改为显式值或 missing |
| Registry / 自校准 | 两项均进入真实 64 项 Registry 与 frame report 校准链 |
| Delivery | knownUnsupported=[],保留 Smooth 同窗数值与产品阈值校准门禁 |
| 工作台 | Frame Time 入口明确说明 Session 报告同时生成 TinyJank / Smooth |
| 版本 | Foundation collector-foundation.2.0-beta;Mac App 1.0.0 (29);Frame Report candidate.v3 |
确定性验证
| 场景 | TinyJank | Smooth | 结果 |
|---|---|---|---|
| 稳定 60 Hz | 0 | 0 | 合法稳定值 |
| 稳定 120 Hz | 0 | 0 | 合法稳定值 |
| 单次微毛刺 | 1 | 大于 0 | TinyJank 命中且波动上升 |
| 短窗口 | 0 次判定 | null | Smooth 正确 fail-closed |
| 包内固定 Fixture | 1 | 75.13009550107067 | TinyJank 与 SmallJank /10min 完全一致 |
E4 既有真机源回放
下表使用此前已接受的匿名 CoreProfile presented-frame E4 源进行离线回放;没有重新连接设备,也没有将短窗口扩大解释为长时体验结论。
| 样本 | 有效 FrameTime | TinyJank Count | Smooth | 解释 |
|---|---|---|---|---|
| 设备 A · iOS 17 | 8 | 2 | 501.319 | 极短窗口,链路证据 |
| 设备 B · iOS 18 | 34 | 3 | 44.864 | 短窗口,链路证据 |
匿名机器可读证据:下载 JSON。文件不包含设备标识、设备名、Bundle ID 或 PID。
最终回归与产物
| 项目 | 最终结果 | 证据 |
|---|---|---|
| Python | 冻结 CPython 3.12 环境 188/188 | E2 |
| Swift | 83/83 | E2 |
| Foundation | collector-foundation.2.0-beta x86_64;289 个清单文件;归档 SHA-256 3de39532…c07e | E2 |
| Mac App | 1.0.0 (29) x86_64;包内 pmd3 11.3.1 / Foundation 2.0-beta probe ready | E2 |
| 签名 | ad-hoc codesign --verify --deep --strict 通过 | E2 |
| Registry / Stat | 64 项 Registry;29 Stat;knownUnsupported=[] | E2 |
| 真机来源 | iOS 17/18 既有 E4 CoreProfile 源可生成 TinyJank / Smooth | E4 source replay |
未关门门禁
- Smooth 尚未进行 PerfDog 同一设备、同一场景、同一时间窗的数值校准,不能宣称数值等价。
- 现有真机回放窗口过短;需补前台静止、连续滚动、动画与重负载的长 Session,才能制定 Perfowl 自有分级阈值。
- Frame Time 仍是
foreground-device,尚未证明目标 PID 独占的逐帧归因。 - iOS 15、iOS 17.4–17.x 与更多机型兼容覆盖仍开放。
下一阶段工作与整体进度
- 下一阶段:优先完成 P3 长窗口校准与目标进程归因证据;如继续暂停竞品同窗,则先用可控 Fixture 建立 Smooth 稳定性分布和 TinyJank 长时一致性,再进入 P6 Time Profiler / Hitches 增强。
- 整体进度:P0、P1 已完成;P2 Startup 官方链与 P3 TinyJank / Smooth 产品链已完成,P2 数值同窗、P3 长时/归因、P4 人工 UI、P5 物理放电与 ThermalStatus、P6 其余增强及 P7 云端仍为开放项。