产品动态

使用 Unity 优化 Android XR 的性能

阅读用时:6 分钟
Luke Hopkins
开发者关系工程师,Android

Samsung Galaxy XR 现已推出,由 Android XR 提供支持!这篇博文是我们 Android XR Spotlight Week 的一部分,我们在此期间提供各种资源(博文、视频、示例代码等),旨在帮助您学习、构建应用并为 Android XR 做好准备。  

本周,Samsung 推出了与 Google 和 Qualcomm 合作打造的 Galaxy XR。对于开发者来说,这是一个激动人心的时刻,我们希望帮助您充分发挥 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 常驻绘制器会自动使用 GPU 实例化来减少绘制调用并释放 CPU 处理时间。因此,GPU 会将相似的对象批量处理,而不是 CPU 单独告知 GPU 每个对象。

此功能对于具有重复网格的大型场景最有效,例如森林中的树木、办公楼中的家具或散布在环境中的道具。

想象一下,一个森林场景中有 200 棵树,它们使用相同的基本网格。如果没有 GPU 常驻绘制器,您将有 200 个绘制调用占用 GPU,从而释放 CPU。启用此功能后,GPU 将智能地实例化这些树,这应将其减少到仅 5-10 个绘制调用。这样可以节省大量 GPU 资源,您可以将其用于游戏逻辑或物理计算。

GPU 遮挡剔除

GPU 遮挡剔除 使用 GPU 而不是 CPU 来识别并跳过渲染隐藏的对象。它会自动检测其他对象后面遮挡(隐藏)的内容,因此您不会将 GPU 浪费在用户看不到的内容上。

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

例如,假设您正在构建一个多房间住宅体验。当用户在客厅时,为什么还要浪费 GPU 周期来渲染完全隐藏在墙壁后面的详细厨房?GPU 遮挡剔除会自动跳过渲染这些隐藏的对象,从而为您实际可见的内容提供更多性能预算。

监控性能

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

Metrics API

性能指标 API 提供对应用内存用量、CPU 性能和 GPU 性能的实时监控。它为您提供来自合成器和运行时层的全面数据,以便您准确了解应用中发生的情况。

在进行更改之前建立基准,应用优化,衡量影响,然后迭代。这种数据驱动的方法意味着您 知道 自己实际上是在提高性能,而不是猜测。

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

如果没有这些指标,您就是在盲目优化。性能指标 API 会告诉您哪些内容实际上对您的特定用例有帮助。

帧调试器

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

想要确认 SRP 批处理程序是否正常运行?在帧调试器中查找“RenderLoopNewBatcher”条目。检查 GPU 常驻绘制器是否正确批处理?查找“混合批处理组”条目。这些视觉确认有助于您了解优化设置是否真正生效。

逐步执行场景的前 50 个绘制调用。如果您看到相似的对象是单独绘制而不是批量绘制的,则说明您的实例化或批处理功能未正常运行。帧调试程序会立即显示这些问题,以便您解决它们。

其他优化

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

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

如需了解有关这些优化及更多优化的分步说明,请参阅我们的完整 Unity Performance Guide for Android XR。

总结

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

您的路线图如下:

  1. 首先使用注视点渲染和 Vulkan 子采样。这些 XR 特定的功能可立即显著节省 GPU 资源。
  2. 如果您有具有重复几何图形或室内空间的复杂场景,请添加 GPU 常驻绘制器和遮挡剔除。
  3. 使用性能指标 API 监控所有内容,以确保您的更改确实有帮助
  4. 探索其他 URP 优化,以获得额外的性能空间

持续衡量和迭代至关重要。并非每项优化都能为每个项目带来同等的好处,因此请使用性能指标 API 清楚了解哪些内容实际上对您的特定用例有帮助。

后续步骤:拓展技能

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

作者:

继续阅读