swiftui-performance-audit - understanding-improving-swiftui-performance
2026/10/9 5:19:27
网站建设
项目流程
理解并改进 SwiftUI 性能(摘要)
背景:Apple 关于使用 Instruments 诊断 SwiftUI 性能、并应用设计模式以减少长时间或高频更新的指导。
核心概念
- SwiftUI 是声明式的;视图更新由状态、环境和可观察数据依赖驱动。
- 视图 body 必须快速计算以赶上帧截止时间;缓慢或频繁的更新会导致卡顿。
- Instruments 是查找长时间更新和过度更新频率的主要工具。
Instruments 工作流程
- 通过 Product > Profile 进行性能分析。
- 选择 SwiftUI 模板并录制。
- 执行目标交互。
- 停止录制并检查 SwiftUI 轨道和 Time Profiler。
SwiftUI 时间线泳道
- Update Groups:SwiftUI 计算更新所花时间的概览。
- Long View Body Updates:橙色 >500us,红色 >1000us。
- Long Platform View Updates:SwiftUI 中托管的 AppKit/UIKit 视图。
- Other Long Updates:几何/文本/布局以及其他 SwiftUI 工作。
- Hitches:错过帧截止时间、UI 未能及时就绪的丢帧。
诊断过长的视图 body 更新
- 展开 SwiftUI 轨道;检查模块特定的子轨道。
- 设置检查范围(Inspection Range)并与 Time Profiler 关联。
- 使用调用树或火焰图识别开销大的帧。
- 重复更新以收集足够的采样用于分析。
- 过滤到特定更新(Show Calls Made by
MySwiftUIView.body)。
诊断频繁更新
- 使用 Update Groups 查找没有长时间更新但持续活跃的组。
- 在组上设置检查范围并分析更新次数。
- 使用 Cause 图(“Show Causes”)查看触发更新的原因。
- 将原因与预期的数据流进行比较;优先处理频率最高的原因。
修复模式
- 将开销大的工作移出
body并缓存结果。 - 使用
Observable()宏将依赖范围限定到实际读取的属性。 - 避免将更新扩散到许多视图的宽泛依赖。
- 减少布局变动;将依赖状态的子树与布局读取者隔离。
- 避免存储捕获父状态的闭包;预计算子视图。
- 通过阈值对频繁更新(如几何变化)进行门控。
验证