产品资讯

使用 Unity 优化 Android XR 的性能

阅读用时:6 分钟
查看 Luke Hopkins 的个人资料
Luke Hopkins Android 开发者关系工程师

Samsung Galaxy XR 重磅登场,由 Android XR 提供支持!这篇博文是 Android XR Spotlight Week 的一部分,我们在此期间提供博文、视频、示例代码等资源,旨在帮助您学习、构建和准备适用于 Android XR 的应用。  

本周,三星推出了 Galaxy XR,这是与 Google 和高通合作打造的产品。这对开发者来说是一个激动人心的时刻,我们希望帮助您让 XR 应用发挥最佳性能。

在非 XR 设备上,游戏和应用性能不佳可能会让用户感到沮丧,但在 XR 世界中,性能不仅是可选项,更是应用成功的基石。如果您在 XR 中未能达到目标帧速率,可能会导致更严重的问题,例如晕动症。

在本指南中,我们将逐步介绍您在进行 Android XR 开发时需要了解的基本性能优化。您将了解哪些功能可以带来最大的性能提升、何时使用这些功能,以及这些功能如何协同工作来帮助您实现帧速率目标。

我们的目标如下:

  • 最低标准: 72fps(我们的 Play 质量指南中的一部分)
  • 可选: 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 单独告知 GPU 每个对象的信息。

此功能最适合包含重复网格的大型场景,例如森林中的树木、办公楼中的家具或散落在环境中的道具。

想象一个森林场景,其中有 200 棵树使用相同的基本网格。如果没有 GPU Resident Drawer,您将有 200 个绘制调用占用 GPU,从而释放 CPU。启用此功能后,GPU 会智能地实例化这些树,从而将绘制调用次数减少到 5-10 次。这可以节省大量 GPU 资源,让您能够将这些资源投入到游戏逻辑或物理计算中。

GPU 遮挡剔除

GPU 遮挡剔除使用 GPU 而非 CPU 来识别并跳过渲染隐藏对象。它会自动检测哪些内容被其他对象遮挡(隐藏),这样您就不会在用户看不到的内容上浪费 GPU。

此功能在具有多个房间的室内空间、密集环境或墙壁、地板和物体自然遮挡视线的建筑场景中尤为强大。

举例来说,假设您要打造一个多房间住宅体验。当用户身处 Living Room 时,为什么要浪费 GPU 周期来渲染完全隐藏在墙后的厨房细节呢?GPU 遮挡剔除功能会自动跳过渲染这些隐藏对象,从而为您提供更多性能预算,用于渲染实际可见的内容。

监控效果

仅仅使用这些功能还不够。您还需要衡量优化效果,以便量化其影响并验证更改是否确实有效。

Performance Metrics API

Performance Metrics API 可实时监控应用的内存用量、CPU 性能和 GPU 性能。它会为您提供来自合成器和运行时层的全面数据,让您能够确切了解应用中发生的情况。

在做出更改之前,先建立一个基准,然后应用优化措施、衡量影响并不断迭代。这种以数据为依据的方法意味着,您知道自己实际上是在提升效果,而不是在凭空猜测。

在启用注视点渲染之前,您的 GPU 帧时间可能是 13 毫秒,这超出了 11 毫秒的预算。启用注视点渲染,再次测量,您应该会看到它降至 9 毫秒。这样,您就获得了 4 毫秒的余量,可以为场景添加更多细节、提升其他方面的视觉质量,或者只是确保在更广泛的内容中实现更流畅的性能。

如果没有这些指标,您就无法进行有针对性的优化。Performance Metrics API 会告诉您哪些因素对您的具体应用场景有实际帮助。

帧调试器

帧调试器是 Unity 的内置工具,用于准确了解场景是如何逐帧渲染的。它会显示绘制调用序列,并让您逐步执行这些调用,以验证优化是否正常运行。

想确认 SRP Batcher 是否正常运行?在 Frame Debugger 中查找“RenderLoopNewBatcher”条目。正在检查 GPU Resident Drawer 是否在正确进行批处理?查找“Hybrid Batch Group”条目。这些直观的确认信息有助于您了解优化设置是否确实生效。

逐步执行场景的前 50 个绘制调用。如果您看到类似的对象是单独绘制而不是批量绘制的,则说明实例化或批处理无法正常运行。帧调试器可让这些问题立即显现,以便您及时解决。

其他优化

除了上述优化措施之外,我们的完整性能指南还涵盖了其他一些优化措施。以下是简要总结:

  • URP 设置:为移动 XR 停用 HDR 和后处理。与在移动硬件上产生的性能开销相比,这些功能对视觉效果的影响微乎其微,因此您将获得可衡量的性能提升,而视觉差异几乎无法察觉。
  • SRP Batcher:可降低使用相同着色器变体的多个材质场景的 CPU 开销。通过最大限度地减少绘制调用之间的渲染状态更改,您可以显著减少用于渲染的 CPU 时间。
  • 显示刷新率:根据场景复杂度在 72fps 和 90fps 之间动态调整。在复杂场景中降低帧速率以保持稳定性,在简单场景中提高帧速率以实现超流畅的互动。
  • 深度/不透明纹理:除非着色器效果特别需要,否则请停用这些纹理。它们会导致不必要的 GPU 复制操作,从而浪费性能,而不会为大多数应用带来任何好处。
  • URP 渲染比例: 此设置可让您以较低的分辨率进行渲染,从而提升性能,或提升渲染分辨率,从而增强视觉质量。

如需了解这些优化及更多优化的分步说明,请参阅完整的 Android XR Unity 性能指南。

总结

XR 应用的性能不仅仅是一个技术指标,这决定了用户体验是舒适、引人入胜,还是令人感到不适或不舒服。我们介绍的优化措施是您在最新 XR 设备上实现关键帧速率目标的工具包。

以下是您的路线图:

  1. 首先,请使用注视点渲染和 Vulkan 下采样。这些 XR 专属功能可立即显著节省 GPU 资源。
  2. 如果您的场景较为复杂,包含重复的几何图形或内部空间,请添加 GPU Resident Drawer 和遮挡剔除。
  3. 使用 Performance Metrics API 监控所有内容,确保您的更改确实有帮助
  4. 探索其他 URP 优化,获得更多性能提升空间

持续衡量和迭代至关重要。并非每项优化都会让每个项目获得同等收益,因此请使用 Performance Metrics API 清楚了解哪些优化实际上对您的特定用例有帮助。

后续步骤:拓展技能

准备好深入探索了吗?您可以访问以下资源:

  • Unity Performance Guide for Android XR - 此处涵盖的所有功能的完整分步实现说明。
  • Unity 和 Android XR 使用入门 - 设置开发环境并 开始构建。
  • Android XR 开发者文档 - 涵盖所有 Android XR 功能的综合指南
作者:
继续阅读