探索全新的 swiftui instrument。我们将介绍 swiftui 如何更新视图、app 数据的变化对这些更新会产生什么影响,以及新的 instrument 如何帮助你以可视化方式了解相应的原因和效果。
为了充分从这个讲座中获益,建议你先熟悉一下如何用 swiftui 编写 app。
此文章由AI生成,可能存在错误,如有问题,请联系djs66256@163.com
使用 Instrument 优化 SwiftUI 性能
概述
在 WWDC 的主题演讲中,来自 Instruments 团队的 Jed 和 Apple Music 团队的 Steven 共同介绍了全新的 SwiftUI Instrument 工具,该工具旨在帮助开发者识别并解决 SwiftUI 应用中的性能瓶颈问题。性能问题通常表现为应用响应迟缓、卡顿、动画跳帧或滚动延迟等现象,这些都会严重影响用户体验。
全新 SwiftUI Instrument 介绍
Instruments 26 中引入了专为 SwiftUI 设计的分析工具,包含三个主要组成部分:
- SwiftUI Instrument:核心工具,提供 SwiftUI 工作时段的可视化分析
- Time Profiler:显示 CPU 工作负载情况
- Hangs 和 Hitches 工具:追踪应用响应性问题
SwiftUI Instrument 提供了多层级的性能分析视图:
- “Update Groups”显示 SwiftUI 的工作时段
- “Long View Body Updates”标记耗时过长的视图 body 更新
- “Long Representable Updates”标识视图控制器更新
- “Other Long Updates”显示其他长耗时工作
其中,橙色和红色标记分别表示可能造成卡顿和严重性能问题的区域。
诊断长耗时视图 body 更新
在 Landmarks 应用的案例研究中,Steven 展示了如何使用 SwiftUI Instrument 诊断滚动卡顿问题。通过分析发现,LandmarkListItemView
中的distance
计算属性频繁创建MeasurementFormatter
和NumberFormatter
实例,导致视图 body 更新耗时过长。
Jed 解释了 SwiftUI 的渲染循环机制:每帧处理事件后更新 UI,所有工作必须在帧截止前完成。长耗时视图 body 可能导致错过截止时间,造成卡顿。
优化方案是将距离字符串计算移至LocationFinder
类中预计算并缓存:
1 | // 在 LocationFinder 中预计算距离 |
修改后,视图只需通过distance(from:)
方法获取缓存值,显著提高了滚动流畅度。
理解更新的因果关系
Steven 在添加收藏功能时发现,点击单个收藏按钮会导致多个列表项视图更新。通过 Cause & Effect Graph 分析,发现原因是所有LandmarkListItemView
都依赖完整的favorites
数组。
解决方案是为每个地标创建独立的 ViewModel 管理收藏状态:
1 | class LandmarkViewModel: ObservableObject { |
每个视图拥有专属 ViewModel 实例,直接切换 ViewModel 状态而非操作全局数组。追踪数据显示优化后只有被点击的视图会更新。
Jed 进一步解释了环境依赖的传播机制,强调环境值更新会通知所有依赖视图,但只有实际使用该值的视图需要重新运行 body。
性能优化要点总结
- 保持视图 body 快速执行:避免复杂计算和频繁对象创建
- 设计数据流仅触发必要更新:使用细粒度数据依赖
- 慎用高频变更的依赖项:考虑使用 ViewModel 或中间层
- 频繁使用 Instruments 分析:开发过程中持续监控性能
相关资源
相关视频
通过 Instruments 优化 CPU 性能
使用 Instruments 分析挂起
探索 SwiftUI 动画
解密 SwiftUI 性能
使用 SwiftUI 构建自定布局
揭开 SwiftUI 的神秘面纱
探索 UI 动画阻碍与渲染循环
文档
Analyzing the performance of your visionOS app
Improving app responsiveness
Measuring your app’s power use with Power Profiler
Performance and metrics
Understanding and improving SwiftUI performance
全新 SwiftUI Instrument 为开发者提供了强大的性能分析工具,结合这些优化原则和实践,可以帮助构建更加高效流畅的 SwiftUI 应用。