Skip to content

Build 56 CoreProfile 预热解耦与事件驱动快速旋转 ​

背景与真机测试事实 ​

在 iPhone 15 真机针对上一轮 CoreProfile 容错与降级机制进行多轮实测后,观察到如下现象:

  1. 测试 1 (StartupTiming = ON, FrameTime = OFF):StartupTiming 正常有值。
  2. 测试 2 (StartupTiming = ON, FrameTime = ON):StartupTiming 正常有值,FrameTime 最终有值,但用户感知约 19 秒后才出现。
  3. 测试 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;
    • 补充 T0∼T7 全流程耗时打点遥测(drainDurationMs, restartDurationMs, totalRotationDurationMs)。单测基准证明早停竞速等待耗时由 2.0s 骤降至 0.108s。

验证与测试 ​

  • 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-256 042f52f078fea33dceef11b030563ff712256afc69cd581c98cab77400451090)
  • DMG:MacApp/dist/Perfowl-internal-test-Build56-x86_64.dmg(140,671,792 bytes,SHA-256 d40b5deb4db97b5c7ec3c94c640f4b253345ddc8e0ad2d950dfec7e357ce04b7)
  • 主可执行文件:MacApp/dist/Perfowl.app/Contents/MacOS/Perfowl(6,593,088 bytes,SHA-256 59187c99cb2ae813282398a6b9871075cc580dffd2819438b556c814c044d859)

Perfowl · Performance Observer