外观
Build 56 CoreProfile 预热解耦与事件驱动快速旋转
背景与真机测试事实
在 iPhone 15 真机针对上一轮 CoreProfile 容错与降级机制进行多轮实测后,观察到如下现象:
- 测试 1 (StartupTiming = ON, FrameTime = OFF):StartupTiming 正常有值。
- 测试 2 (StartupTiming = ON, FrameTime = ON):StartupTiming 正常有值,FrameTime 最终有值,但用户感知约 19 秒后才出现。
- 测试 3 (StartupTiming = OFF, FrameTime = ON):CoreProfile 正常启动无 busy,采集到 174 个 Raw chunk,但 FrameTime 始终没有数值(呈现帧 Debug ID
0x31800318出现 0 次)。
核心根因分析与架构修复
1. P0:FrameTime-only 无数据根因彻底解决
- 根因分析:
CoreProfileSessionTap.__init__(provider, time_config, filters)在实例化瞬间就会将filters序列化写入tc[0][kdf2]。基类_RawStreamAdapter.prepare_transport()在应用选择后的 Prewarm 阶段调用了self._make_stream()并缓存于self._prepared_stream。此时由于尚未进入采集,options中仅包含默认/启动过滤,未包含呈现帧掩码0x31800000。在用户未选 StartupTiming、仅选 FrameTime 点击开始时,start()直接复用了预热阶段创建的旧 Tap 实例,导致后续 chunk 中永远不含0x31800318。 - 架构解耦:
CoreProfileRawAdapter覆盖prepare_transport():仅建立通道连接和获取时钟配置,严禁实例化CoreProfileSessionTap,始终保持self._prepared_stream = None;CoreProfileRawAdapter覆盖start()与restart():严格根据本次 Session 最终确定的options["filters"](包含0x31800000)动态构造全新 Tap 实例;- 增加
coreProfileConfigSignature与effectiveCoreProfileConfig遥测,彻底杜绝配置缓存与配置漂移。
2. P1:Startup + FrameTime 首值延迟高(19s → 快速事件驱动旋转)
- 延迟分析:冷启动在 T=3.4s 完成,随后
flush_startup_core_profile包含 2.0s 固定无条件 sleep,且在 completion wait 阶段未做事件驱动竞速,导致旋转耗时累加至 12.27s。 - 竞速优化:
- 将 2.0s 固定 sleep 改造为
(startup_trace_complete.wait(), stop_event.wait())双向事件竞速; - 一旦启动耗时解码器确认启动完成(
liveComplete is True或非 partial),立即取消 2.0s 等待,直奔 flush/drain; - 补充
全流程耗时打点遥测( drainDurationMs,restartDurationMs,totalRotationDurationMs)。单测基准证明早停竞速等待耗时由 2.0s 骤降至 0.108s。
- 将 2.0s 固定 sleep 改造为
验证与测试
- Python Sidecar:全量 390/390 通过,新增
test_core_profile_prepare_transport_does_not_cache_stale_tap_and_uses_fresh_options_on_start与test_startup_flush_races_delay_when_startup_completes_early。 - Swift 客户端:全量 145/145 通过(含 3 项显式跳过,0 失败)。
- 打包与签名:生成 Build 56
Perfowl.app、ZIP 与 DMG,通过 Developer ID 严格验签、hdiutil verify与解包挂载校验。
交付产物与哈希
- ZIP:
MacApp/dist/Perfowl-internal-test-Build56-x86_64.zip(109,217,096 bytes,SHA-256042f52f078fea33dceef11b030563ff712256afc69cd581c98cab77400451090) - DMG:
MacApp/dist/Perfowl-internal-test-Build56-x86_64.dmg(140,671,792 bytes,SHA-256d40b5deb4db97b5c7ec3c94c640f4b253345ddc8e0ad2d950dfec7e357ce04b7) - 主可执行文件:
MacApp/dist/Perfowl.app/Contents/MacOS/Perfowl(6,593,088 bytes,SHA-25659187c99cb2ae813282398a6b9871075cc580dffd2819438b556c814c044d859)