大多数浏览器和
Developer App 均支持流媒体播放。
-
优化空间计算 App 的功耗和性能
了解如何通过优化性能和效率来为 VisionOS 创建功能强大的 App 和游戏。我们将介绍该平台独特的功耗特性,探索构建性能计划,并分享一些测试和优化 App 的工具和策略。
章节
- 0:38 - Explore performance with spatial computing
- 1:45 - Profile your app
- 6:19 - Explore render performance
- 8:13 - Optimize SwiftUI and UIKit content for render performance
- 10:50 - Optimize RealityKit content for render performance
- 16:55 - Optimize Metal apps for render performance
- 18:57 - Learn about user input performance
- 20:14 - Optimize ARKit usage
- 22:09 - Explore audio and video playback performance
- 24:12 - Bring great performance to SharePlay experiences
- 25:20 - Avoid terminations from thermal and memory pressure
资源
相关视频
WWDC23
- 为快速查看空间体验创建 3D 模型
- 了解用于空间计算的 ARKit
- 打造出色的空间播放体验
- 探索 Reality Composer Pro 中的材质
- 探索空间计算的渲染
- 认识 RealityKit Trace
WWDC22
WWDC21
WWDC20
WWDC19
WWDC18
-
下载
♪ 悦耳的器乐嘻哈 ♪ ♪ 嗨 我是 Roy Performance 团队的一名工程师 我们今天会介绍如何 为空间计算优化 App 首先 我们来了解一下 这个新平台的性能和功耗特点 然后 我们会从 分析 App 性能开始 介绍如何建立性能计划 最后 我们会介绍 优化平台性能问题的最佳方法 那么空间计算在功耗和性能方面 有什么不同之处呢? 一方面 无论 App 是否更新 显示屏上的内容一直都在更新 当用户移动身体、手或转动眼睛时 内容也需要更新 也就是说系统时刻都在 渲染每一帧 此平台也时刻在运行空间算法 以在每个 App 中 创建视觉和交互体验 并可以同时运行多个 App 用户会同时使用 你的 App 和其他 App 为了进行多任务处理 以及额外的系统工作 你应该尽可能优化 App 资源的使用情况 在提供绝佳的用户体验方面 App 的性能至关重要 用户希望 App 能立即响应输入 并提供顺滑的视觉更新 从而获得沉浸和舒适的体验 我们来看看如何针对性能问题 来描述并分析你的 App 你可能对其他 Apple 平台的性能指标 已经很熟悉了 无论在哪个平台 用户都想要能快速启动、 避免磁盘磨损 且不会过度消耗电池的 App 他们还希望 App 避免 因内存使用效率低而终止运行 使用空间计算 其中一些指标 有了新含义 拿功耗举例 由于热压力的缘故 用户希望优化 App 功耗 而不是电池续航时间 为了保持良好的性能 你需要优化 App 系统功耗 从而降低出现热压力问题的可能性 另一个例子是挂起 当 App 的主线程 在一段时间内暂停运作时 这种情况就会发生 但在此平台上 短暂的暂停 也会影响 App 的响应能力 再说说渲染 在其他平台上 你可能会优化 渲染性能 这主要是为了提供 顺畅的 UI 和 3D 动画体验 但在此平台上 渲染性能 对静态内容也很重要 因为系统一直处于渲染状态 所有 Apple 平台都提供 分析这些指标的工具 今天 我们来介绍如何 为空间计算 App 查找性能问题 想要进一步了解 在任意 Apple 平台上 优化这些指标的信息 请查看讲座 “Ultimate App 性能生存指南” 你可以在开发时使用 Instruments 和 Xcode Gauges 这样的工具 进行性能分析以优化你的 App App 发布后 你可以从 实际使用环境中收集更多数据 以进一步优化 App 我们来继续聊聊 开发过程中的描述分析功能 RealityKit Trace 是 Instruments 中的全新模板 可帮你分析所有空间 App 的 性能和功耗 这个绝佳工具可帮你确认 App 在何时渲染性能差 或何时导致系统功耗过高 你还可以使用其他更多工具模板 想要进一步了解更多信息 以及探索如何使用新模板 请查看 “了解 RealityKit Trace”讲座 App 的性能和功耗取决于 用户的交互方式 模拟器无法执行真实设备的工作 所以其性能数据可能不准确 因此 应在真实设备上 进行分析工作 当播放音频或视频 或者使用 FaceTime 通话 和 Personas 之类的技术时 请使用 App 中的 各种交互方式来进行分析 在几分钟的使用过程中 请确保检查 性能良好和低系统功耗 最后 在其他 App 运行并使用资源时 请进行分析 如果你要引入兼容的 iPad 和 iPhone App 请确保在设备上对其进行分析 以确定需要进一步优化的地方 开发完成后 用户可能会在各种条件下 运行你的 App 使用实际环境中的数据可以有效发现 用户实际遇到的问题 如果你的 App 是 Beta 版或已发布 请使用 MetricKit 从用户那里获取诊断报告 Xcode Organizer 提供经过用户设备同意的 汇总性能数据 包括能量诊断 其可以帮助发现功耗问题 所有这些收集的数据 都可以帮你找出瓶颈问题 并对 App 的性能工作 进行优先排序 现在 我们来聊聊 优化你的空间计算 App 性能问题可能出现在多个方面 今天 我们会介绍几个 核心方面的优化策略: 渲染、用户输入、ARKit、 音频和视频回放、同播共享 以及因系统压力造成的 App 终止运行 想要提供良好用户体验 出色的渲染性能是重中之重 我们来深入了解一下 在此平台中 渲染管线 从你的 App 开始 负责更新 App 内容 与所有 Apple 平台一样 你的 App 界面 在主线程上更新 并且必须及时提供更新 由于你的 App 和其他 App 一起在 3D 空间中进行渲染 所以你 App 的更新会 发送到系统渲染服务器 渲染服务器持续运行 以处理来自 App、用户输入 以及空间和环境中的更新 渲染服务器使用这些更新 渲染新的帧 然后将其发送到合成器中 合成器始终保持渲染状态 它为显示屏提供新的帧 其速率与显示屏的刷新速率相匹配 以上流程可以为你带来舒适的体验 帧率通常为每秒 90 帧 但还可以更高 当合成器持续更新显示屏时 你的 App 还需要 提供快速的视觉更新 以提供良好的用户体验 如果 App 内容或更新的 渲染时间过长 渲染服务器可能会超出 最佳渲染反应时间的截止时限 也就是说 App 的 视觉内容原本应该 在合成器 Y 帧上完成渲染 但实际是在 Y+1 帧上完成的 这会延迟用户 在显示屏上看到的视觉更新 而且用户还会觉得 App 反应慢 渲染严重停顿甚至可能导致 App 终止运行 无论你的 App 构建于 SwiftUI、UIKit、 RealityKit 还是 Metal 你肯定都希望 优化其内容和更新以减少丢帧 和渲染服务器上的工作量 我们从优化 SwiftUI 和 UIKit 的使用开始 在这个平台上 即使没有 App 更新 系统也会渲染静态 UI 内容 过度绘制可能会增加渲染工作量 当其他虚拟内容前面 有半透明内容时 就会出现过度绘制的情况 图形处理器需要渲染这两部分内容 但如果半透明内容完全不透明 图形处理器就不需要 渲染其后面的任何 UI 如果你有 Z 轴偏移的 重叠 UI 视图 请避免对其添加半透明效果 此外 App UI 占据 显示屏上的像素越多 渲染窗口的工作量就越大 因此 你需要考虑减小 App UI 的默认尺寸 App 更新通常会 触发渲染服务器中的 UI 重绘 但在此平台上 Core Animation 图层的动态内容缩放 也会触发 UI 重绘 在这种情况下 文本分辨率 或基于矢量的 UI 内容分辨率 会随用户的视线位置而改变 从而提供更清晰的视觉效果 这样一来 即使 App 没有更新 渲染服务器也会 更频繁地重绘 UI 内容 SwiftUI 和 UIKit 默认启动此操作 但使用自定义 Core Animation 或 Core Graphics 渲染的 App 可选择是否进行此操作 想要进一步了解 其视觉效果的益处及利弊权衡 请查看讲座 “探索空间计算的渲染” 离屏渲染通道会极大地影响 重绘成本 这可能主要是由阴影、 模糊以及遮罩等视觉效果导致的 减少这些效果可以 使 App 的系统渲染操作更简便 为了减少 App 的重绘 请尽可能避免不必要的视图更新 例如 使用 SwiftUI 时 请使用 @Observable @Observable 提供 更多的粒度变化跟踪 并减少不必要的布局更新 接下来 我们来聊聊 如何使用 RealityKit 优化 3D 渲染 针对空间计算 SwiftUI 今年 增加了 RealityView 它可在 SwiftUI 层次结构中 本地显示 RealityKit 3D 场景 通过为所有这些 RealityKit 功能 优化 3D 场景 你的 App 可以在平台上良好运作 在这些 3D 场景中 其中包含资源的复杂度 会极大地增加 渲染服务器渲染每帧的工作量 所以 我们先从优化这些资源开始 Reality Composer Pro 帮你 使用资源创建 RealityKit 场景 此工具提供整个场景的相关数据 从网格渲染、粒子、动画、 到物理属性和音频工作 可以帮助你了解其性能影响 进行数据检测时 数字越小通常代表 渲染工作量越少 这样可以优化渲染性能 你可以查看讲座 “为快速查看 空间体验创建 3D 模型” 以了解更多关于 3D 资源的 视觉效果和功耗的最佳实践 网格渲染是 3D 渲染的核心部分 复杂的网格和材质可能很快就会成为 性能方面的瓶颈问题 因此 你应优化 网格资源的几何结构 通过组合共享材质的部件 来减少独立网格部件的数量 带有复杂三角形 和顶点计数的网格几何结构 成本也比较高 请使用所需顶点数量较少的资源 减少 3D 网格重绘的影响 为了实现这一点 请谨慎使用透明度 与 UI 内容的使用原则相同 Reality Composer Pro 中 “基于物理特性”的材质 拥有环境光照 已经过良好优化 最适合应用于 具有最小透明度的网格 但是对于半透明或非常大的内容 请考虑使用 带有未照明表面的自定义材质 使用烘焙光照纹理 或其他成本较低的视觉效果 这样有助于避免 因高成本光照计算 而出现潜在瓶颈问题 想要进一步了解 在 RealityKit 中构建 并使用材质的指导信息 请查看这两节讲座 运行时渲染优化好的内容 是一个良好开端 你还可以使用 RealityKit 进行更多的 App 优化操作 当你的 App 更新 其 RealityKit 内容时 更新会被发送到渲染服务器 渲染服务器会应用并渲染这些更新 但在短时间内进行太多更新 可能会成为渲染服务器的瓶颈问题 例如 你的 App 可能会 快速创建和销毁 RealityKit 实体 它可能包含太多复杂动画 更新太多 SwiftUI 视图 或者在单个帧中加载许多资源 提前创建实体 并根据需要隐藏或显示它们 你可以在场景层次结构中 移除和添加这些实体 或使用 isEnabled 标志 通过平展网格实体层次结构 最大程度减少更新的实体数量 对于基于代码的动画 你应该考虑降低更新频率 或减少动画更新的实体数量 在更新 RealityKit 实体时 应避免意外触发 过多的 SwiftUI 重绘 使用附件时 请确保按照 优化所有 SwiftUI 内容的方式 来优化附件的渲染 加载复杂资源也有可能触发 高成本的渲染更新 复杂的资源还可能 增加 App 启动和内容加载时间 在运行时 请使用异步加载 API 以避免阻塞主线程 并根据需求提前加载资源 使用相同资源的实体 还可以共享该资源 并且只需加载一次即可 使用从 Reality Composer Pro 中 导出的文件 因为这些文件已经针对加载时间 和内存成本进行了优化 你还可以免费获得纹理压缩 减少资源规模 通常可以加快加载速度 但请记住 Reality Composer Pro 文件 已经进行了纹理压缩 所以你不需要再进行操作 最后 让我们来看看 RealityKit 带来的 沉浸式体验 当你的 App 请求 切换到专用全空间时 它会成为唯一的前景体验运行 当使用门户或进入 完全沉浸式体验空间时 系统还会隐藏 用户的部分或全部周围环境 你的 App 可以 使用 RealityKit 内容 创建一个环境来填充用户空间 与共享空间或全空间中的场景相比 你的完全沉浸式内容需要在显示屏上 以更高的像素进行渲染 也就是说 在图形处理器上需要进行 更多的渲染工作 你应该优化此类内容 以降低图形处理器功耗 在 Reality Composer Pro 中 从具有未照明表面的 “自定义”材质开始 以实现最佳功耗使用 考虑添加烘焙光照纹理 或使用基于时间的动画 来获得动态光照效果的感觉 针对系统功耗 和渲染性能对材质进行分析 你还可以使用 Metal 创建 完全沉浸式体验 考虑到使用 Metal 构建 3D 引擎或体验的开发者 我们来看看相应的优化的方法 你可以使用 Metal 与 CompositorServices 框架 以绕过渲染服务器并将渲染过的表面 直接发送到合成器 请查看讲座 “探索 Metal 以构建沉浸式 App” 以了解如何实现这一操作 当你使用 CompositorServices 时 请调整 Metal 提交帧的配速 这样合成器就可以 在每次更新时接收到新的帧 请确保在每一帧中 查询一个新的凹进图 并进行后续预测 并在开始使用输入数据 进行编码图形处理器工作 之前的最后一刻查询此输入数据 执行这三项操作有助于确保 虚拟内容 及时响应用户动作和输入信息 如果 App 在提交新帧时 花费过长时间 系统会终止 App 运行 要避免任何长时间的帧停顿 在你的 App 运行时 你要确保使用 Metal System Trace Instruments 模板 分析图形处理器性能 来自 Metal App 或 Reality Composer Pro 中 自定义材质的 长时间运行片段和顶点着色器执行 会严重影响系统的渲染时间 为了减少片段和顶点的时间 首先要通过着色器 减少运算器指令和纹理访问 对于 Metal 来说 你应该尽可能使用计算着色器 请回看这些视频以进一步了解 关于优化图形处理器性能的信息 请记住 针对 UI 和 3D 渲染性能优化你的 App 有助于提升用户整体体验 现在 我们来了解一下输入性能 用户可以通过眼睛、手、声音 和硬件输入在此平台上输入信息 App 对输入的更新 在主线程上进行处理 操作耗时过长 会导致你的 App 运行缓慢且响应迟钝 主线程上的输入更新需要 根据显示屏刷新速率 在一定的截止时限内完成 此平台硬件的 刷新速率通常为 90 赫兹或更高 对于 90 赫兹的刷新率 输入更新 要保持在 8 毫秒以下 才可获得最佳的反应时间 与空间内容进行交互时 系统会进行碰撞检测工作 以查看用户正在尝试与哪个 UI 或 3D 物体进行交互 对于 RealityKit 内容 你可以添加物理碰撞器 来与用户进行交互 添加碰撞器时 请尽量使用静态碰撞器 而非动态碰撞器 因为静态碰撞器成本更低 为了减少 App 中 多余的碰撞检测工作 请尽量避免交互内容重叠的情况 我们现在来了解一下 ARKit 在此平台上 ARKit 算法 始终在运行 为每个 App 创建 视觉效果和交互体验 App 使用 ARKit 数据 和锚定虚拟内容的方式 会影响系统功耗和视觉平滑度 例如 你的 App 可以使用 ARKit 或 RealityKit 将锚定内容放置在用户的周围、 头部或手中 每个锚定内容都会 给系统增加额外的工作 锚定内容时 要考虑是否需要 在用户的空间中持续跟踪锚定 在 RealityKit 中 使用 AnchorComponent 时 你应该使用 TrackingMode.once 以避免产生持续跟踪成本 尽量减少 App 中持久锚定 和瞬态锚定的总数 尤其是持久锚定 每个 App 都能添加持久锚定 所以尽量不要在你的 App 中 添加太多此类锚定 在使用 ARKit 数据时 你还可以进行更多的优化操作 如果你在 App 内容中 应用过时的 ARKit 数据 App 的视觉效果 可能会与输入不同步 所以 请在使用之前 查询 ARKit 数据 并及时将其应用到更新中 后续预测的计算成本较高 通常情况下 只有 自定义的 Metal 渲染引擎 需要这种数据 如果你只是想 在场景中放置 App 内容 RealityKit 是一个 不错的替代选项 生成用于场景理解网格碰撞数据的 成本也很高 如果你使用了这些数据 那么请在 App 不需要时将其关闭 现在 我们来聊聊如何为空间计算 优化音频和视频播放 平台默认使用空间音频 系统实时处理 关于用户位置、周围环境 以及音频源的信息来输出音频 如果你的 App 需要系统处理 过多的空间音频 则可能会导致系统能耗问题 或音频输出延迟 如果遇到这些问题 你可以考虑从三个方面 来减少空间音频处理工作: 同时播放的音频源、 移动音频源的数量 和音场的大小 所有这些都是增加 计算工作量的变量 我们再来看一看视频 在共享空间中 用户可以同时播放多个视频 系统需要对每个视频进行解码 并在渲染服务器中对其进行渲染 每个新渲染的视频帧 都需要以一致的间隔传输到显示屏 从而保证良好的视频观看体验 为了给渲染服务器 提供足够的功率和时间 以在截止时限前完成渲染 你的 App 应在视频播放期间 尽量减少 UI 或 3D 内容的更新 视频帧率也会影响渲染工作量 你可以考虑使用 24 或 30 赫兹的视频 以保证最佳性能和功耗 最后 在任何指定时间内 你应该减少 App 设备上 需要同时播放和渲染的 视频数量 选择视频展示方法时 你应该考虑如何针对不同功能和性能 进行优化 你可以查看讲座 “创建良好的空间播放体验” 以了解更多信息 现在 我们再来聊聊同播共享 此平台为与其他用户协作和建立联系 开启了全新的体验 为了创建绝佳的同播共享团体体验 你会想确保 App 可以在长时间内 保持良好的性能 在同播共享中 保持出色的空间计算性能 首先要保证几个基本点 首先 针对本地性能 对你的 App 进行分析和优化 然后 在使用同播共享期间检查 App 以避免在设备之间 同步高成本的渲染更新 对你的 App 进行功耗分析 以确保系统功耗需求 不会产生热压力 这可能会阻碍 App 保持 良好的性能 为了避免这种情况 请仔细考虑 App 中的哪些工作和功能 对其同播共享体验至关重要 并关闭不需要的工作或功能 最后 我们来看一下由于热压力 或内存压力而导致的 App 终止运行 用户可能会在温暖的地方使用设备 和所有的 Apple 平台一样 系统通过管理可用的计算资源 来应对热压力问题 从而为用户提供 凉爽舒适的设备使用体验 计算资源较低 可能会影响 App 的性能 由于热压力达到临界值 或未能满足渲染截止时限 系统甚至可能会终止 App 运行 在面临热压力的情况下 你应该减少 App 的工作量 以保持良好的性能并防止热压力 进一步升高 你可以通过订阅 thermalStateDidChange 通知 来实现这一点 热压力升高时 请调整 App 内容和更新来应对 想要了解 App 在热压力下的性能表现 你可以在 Xcode 中使用热诱导器 来模拟设备在更高热压力下的状态 想要进一步了解有关热压力的信息 请查看讲座 “设计对抗网络和温度条件” 接下来 我们来了解一下内存压力 设备的内存是有限的 系统和所有正在运行的 App 共享这些内存 当设备内存接近极限时 系统开始终止 App 运行 首先会终止非活跃使用的 App 一个 App 如果使用了太多内存 那么即使它正处于 使用状态 也会被终止 你肯定不希望 你的 App 出现这种情况 你可以通过尽量 减少 App 的内存占用 来避免此类情况 在此平台上 App 更倾向于 为 UI 和 3D 渲染 以及音频和视频回放分配大量内存 如果你的 App 有 UI 内容 那么你可以通过减少离屏渲染通道、 窗口总量和媒体内容 来减少渲染内存分配 对于使用 RealityKit 的 3D 内存 纹理分辨率 以及网格和粒子的几何尺寸 都可能严重影响内存使用情况 你应该尽量减少这些相关指标 播放音频和视频时 请评估 App 中 所有音频和视频文件的总内存负载 当更改分辨率、比特率、文件格式 和时长时 请权衡考虑 用户体验和性能 与节省内存之间的利弊关系 你可以回看这些视频来进一步了解 在所有 Apple 平台上 降低内存占用的更多技巧 请记住 在此平台上 性能是打造良好用户体验的关键 首先 你需要在开发过程中 积极分析 App 以发现性能和功耗问题 围绕空间计算的重要指标 建立性能计划 你可以从渲染、功耗 及我们今天涉及到的其他方面 对你的 App 进行优化 最后 使用 MetricKit 和 Xcode Organizer 等工具 从实际使用环境中收集性能数据 我十分期待看到你在此平台上 创建出色的 App 和体验 感谢你的观看 ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。