Samsung Galaxy XR 隆重登场,由 Android XR 提供支持!这篇博文是我们“Android XR Spotlight Week”活动的一部分,旨在提供各种资源(博文、视频、示例代码等),帮助您学习、构建应用并为 Android XR 做好准备。
本周,Samsung 推出了 Galaxy XR,这款设备是与 Google 和 Qualcomm 合作打造的。对于开发者来说,这是一个激动人心的时刻,我们希望帮助您尽可能提升 XR 应用的性能。
虽然非 XR 设备上的游戏和应用性能不佳可能会让用户感到沮丧,但在 XR 世界中,性能不仅仅是可选的,更是应用成功的根本。如果您在 XR 中未达到帧速率目标值,可能会导致更严重的问题,例如晕动症。
在本指南中,我们将逐步介绍 Android XR 开发中需要了解的基本性能优化。您将了解哪些功能可带来最大的性能提升、何时使用这些功能,以及这些功能如何协同工作来帮助您实现帧速率目标。
我们的目标是:
- 最低: 72fps(属于我们的播放质量指南)
- 可选: 90fps,每帧预算为 11 毫秒
如需详细了解为何保持如此高的帧速率非常重要,请参阅我们的性能指南。
特定于 XR 的性能功能
我们将首先介绍两项特定于 XR 的性能功能:注视点渲染和 Vulkan 子采样。
注视点渲染
眼动追踪渲染是一种具有两种模式的优化技术。第一种是静态模式,它以较高分辨率渲染屏幕中心,并随着视线向外移动逐渐降低分辨率。
第二种是眼动追踪模式,该模式会以全细节渲染您正在注视的区域,同时降低外围区域的显示质量。它基本上模拟了人类的视觉工作方式,即我们只会看到我们正在聚焦的特定区域的精细细节。
凹凸透镜渲染可显著减少 GPU 工作负载,同时不会牺牲用户感知到的图像质量。凹凸透镜渲染的妙处在于,用户不会注意到周边视觉中的质量降低,但 GPU 肯定会注意到性能的提升。
假设您正在打造一个展示精美 3D 文物的博物馆体验。如果不采用凹凸透镜渲染,您将难以维持 90fps 的帧速率,因为需要渲染视野范围中的所有内容。而采用凹凸透镜渲染后,您可以在用户注视的位置保留高多边形细节,但以较低的质量渲染背景环境。用户不会注意到这种差异,但您将有足够的空间为场景添加更多细节。
Vulkan 子采样
Vulkan 子采样是凹凸透镜渲染的最佳搭档。虽然凹凸透镜渲染决定了以不同质量级别渲染哪些内容,但 Vulkan 子采样会使用碎片密度图来处理如何高效渲染不同的质量级别。
与凹凸透镜渲染相结合时,Vulkan 子采样可额外提供 0.5 毫秒的性能。它还有助于消除周边视觉中的锯齿状边缘,使整体图像看起来更清晰。
例如,在飞行模拟器游戏中,用户专注于仪表和控制,将凹凸透镜渲染与 Vulkan 下采样相结合意味着详细的控制会清晰地渲染,但外围驾驶舱结构会使用更少的资源。多出的 0.5 毫秒看起来不多,但它决定了在激烈时刻是能够容纳额外的互动元素还是会丢帧。
复杂场景的 GPU 特性
除了凹凸透镜渲染和 Vulkan 子采样之外,还有一些 GPU 功能可通过智能实例化和剔除来减少不必要的压力。这些方法对于具有重复几何体或严重遮挡的复杂场景尤其有效。
GPU 常驻抽屉
GPU Resident Drawer 会自动使用 GPU 实例化来减少绘制调用并释放 CPU 处理时间。因此,GPU 不再需要 CPU 单独告知每个对象,而是将类似的对象批量处理。
此功能对于具有重复网格的大型场景(例如森林中的树木、办公楼中的家具或散布在整个环境中的道具)最为有效。
想象一下,一个森林场景中有 200 棵树,它们使用相同的基本网格。如果没有 GPU Resident Drawer,您将有 200 个绘制调用占用 GPU,从而释放 CPU。启用此功能后,GPU 将智能地实例化这些树,从而将绘制调用减少到只有 5-10 个。这样一来,您就可以节省大量 GPU 资源,然后将其用于游戏逻辑或物理计算。
GPU 遮挡剔除
GPU 遮挡剔除使用 GPU 而不是 CPU 来识别并跳过渲染隐藏对象。它会自动检测隐藏在其他对象后面的遮挡内容,因此您不会将 GPU 浪费在用户看不到的内容上。
在具有多个房间的室内空间、密集的环境或墙壁、地板和物体自然会遮挡视线的建筑场景中,此功能尤其强大。
举例来说,假设您要打造多房间住宅体验。当用户在客厅时,为什么还要浪费 GPU 周期来渲染完全隐藏在墙后的详细厨房?GPU 遮挡剔除会自动跳过渲染这些隐藏对象,从而为实际可见的对象提供更多性能预算。
监控效果
仅仅使用这些功能是不够的。您还需要衡量优化效果,以便量化其影响并验证您的更改是否确实有效。
Performance Metrics API
性能指标 API 可实时监控应用的内存用量、CPU 性能和 GPU 性能。它可提供来自合成器层和运行时层的全面数据,让您准确了解应用中发生的情况。
在进行更改之前,先确定基准,然后应用优化措施、衡量效果并进行迭代。这种数据驱动的方法意味着,您知道自己确实在提升效果,而不是猜测。
在启用凹凸透镜渲染之前,GPU 帧时间可能为 13 毫秒,超过了 11 毫秒的预算。启用凹凸透镜渲染,再次进行测量,希望您会看到它降至 9 毫秒。这样一来,您就获得了 4 毫秒的余量,可以为场景添加更多细节、提升其他方面的视觉质量,或者只是确保在更广泛的内容范围内获得更流畅的性能。
如果没有这些指标,您就无法进行有效的优化。Performance Metrics API 可让您了解哪些因素真正有助于实现您的特定使用情形。
Frame Debugger
帧调试器是 Unity 的内置工具,可用于逐帧了解场景的渲染方式。它会显示绘制调用的顺序,并允许您逐步执行这些调用,以验证优化是否正常运行。
想确认 SRP Batcher 是否正常运行?请在帧调试器中查找“RenderLoopNewBatcher”条目。想检查 GPU Resident Drawer 是否正确批处理?请查找“Hybrid Batch Group”条目。这些直观的确认信息可帮助您了解优化设置是否实际生效。
逐步检查场景的前 50 个绘制调用。如果您发现类似的对象是单独绘制的,而不是批量绘制的,则表明您的实例化或批处理功能未正常运行。借助帧调试器,您可以立即发现这些问题并加以解决。
其他优化
除了上述优化措施之外,我们的完整效果指南还介绍了其他一些优化措施。简要总结如下:
- URP 设置:针对移动 XR 停用 HDR 和后期处理。与它们在移动硬件上的性能成本相比,这些功能提供的视觉效果影响极小,因此您将获得可衡量的性能提升,而视觉差异几乎难以察觉。
- SRP Batcher:可减少使用相同着色器变体的许多材质的场景的 CPU 开销。通过最大限度地减少绘制调用之间的渲染状态变化,您可以显著减少花费在渲染上的 CPU 时间。
- 显示屏刷新率:根据场景复杂程度在 72fps 和 90fps 之间动态调整。在复杂序列期间降低帧速率以保持稳定性,然后在较简单的时刻提高帧速率以实现超流畅的互动。
- 深度/不透明纹理:除非着色器效果有特殊需要,否则请停用这些纹理。它们会导致不必要的 GPU 复制操作,从而浪费性能,而不会为大多数应用带来好处。
- URP 渲染缩放比例: 此设置允许您以较低的分辨率进行渲染以提高性能,或以较高的分辨率进行渲染以提升视觉质量。
如需获取有关这些优化以及更多优化的分步说明,请参阅我们完整的《Unity Android XR 性能指南》。
总结
XR 应用的性能不仅仅是一项技术指标。它决定了用户体验是舒适且引人入胜,还是让用户感到不适。我们介绍的优化方法是您的工具包,可帮助您在最新的 XR 设备上实现关键的帧速率目标。
您的路线图如下:
- 首先使用注视点渲染和 Vulkan 子采样。这些 XR 专用功能可立即显著节省 GPU 资源。
- 如果您有包含重复几何体或室内空间的复杂场景,请添加 GPU Resident Drawer 和遮挡剔除。
- 使用 Performance Metrics API 监控所有内容,确保您的更改确实有帮助
- 探索其他 URP 优化,以获得更多性能空间
持续衡量和迭代至关重要。并非每项优化都能让每个项目受益,因此请使用 Performance Metrics API 清楚了解哪些优化措施确实有助于您的特定应用场景。
后续操作:拓展技能
准备好深入探索了吗?您可以访问以下资源:
继续阅读
-
产品资讯
我们很高兴地宣布,Android XR 现已正式支持 Unreal Engine 和 Godot。我们还推出了旨在提高您的工作效率并实现全新 XR 功能的新工具:Android XR Engine Hub 和 Android XR Interaction Framework。
Luke Hopkins, Ryan Bartley • 阅读用时:4 分钟
-
产品资讯
从增强现实叠加层到完全沉浸式环境,Android XR 生态系统正在快速扩展,Samsung Galaxy XR 现已上市。
Stevan Silva, Vinny DaSilva • 阅读用时:3 分钟
-
产品资讯
每年,Google I/O 都会发布各种生态系统和产品(包括 Android 开发)的新公告和资源。随着开发工作转向 AI 和代理辅助工具,我们扩展了产品,以便更好地支持您以任何方式为 Android 平台构建应用。
Simona Milanovic • 阅读用时:2 分钟
随时了解最新动态
每周通过电子邮件接收最新的 Android 开发洞见。