您想找什么?
Technology

Adaptive Performance带来更高的保真度和更流畅的帧速率

DAVID BERGER / UNITY TECHNOLOGIESContributor
Apr 1, 2019|9 Min
Adaptive Performance带来更高的保真度和更流畅的帧速率
此页面为机器翻译。如需查看原文以确保准确性并作为权威参考,

我们最近结束了 GDC 2019,并在 主题演讲中谈到了Adaptive Performance。我们很高兴地通知您, 预览 版本和 Megacity 移动示例现已推出,因此您可以开始探索此功能。本博客详细介绍了Adaptive Performance以及如何将其应用于您自己的项目。

与电脑或主机游戏不同,要充分利用移动硬件的功能,需要实现微妙的平衡,以使游戏看起来美观且玩起来流畅。最大限度地发挥设备的功能可能会对硬件造成过大的负担,从而导致速度受限、电池寿命缩短和性能不稳定,从而很快损害游戏的性能。对于开发人员来说,考虑到从低端到高端目标设备的范围之广,这个问题变得更加严重。

如今,开发人员采取不同的策略来解决这个问题。我们看到的两种主要方法是:尝试确保游戏在所有目标硬件上都发挥最佳性能,这意味着牺牲图形保真度和帧速率,或者尝试预测硬件行为,这确实很困难,因为没有太多选项可以精确衡量硬件趋势。

Adaptive Performance的工作原理

Adaptive Performance为您提供了一种更好的方式来实时管理设备上游戏的热量和性能,使您能够主动调整游戏的动态性能和质量设置,并充分利用硬件而不会对设备造成过重负担。结果是可预测的帧速率和减少的热量积聚,从而实现更长的游戏时间和更愉快的游戏体验,同时节省电池寿命。

对于开发人员来说,这意味着通过新工具对硬件有新的、更深入的了解,从而使您的游戏更具活力和灵活性,为您的玩家在移动设备上玩游戏时提供最流畅、最佳性能的体验。它使您可以控制操作系统通常做出的决策,例如何时以高时钟速度运行或进行什么调整以避免节流。

我们在 GDC 2019 期间多次讨论此功能。 您可以 在此处 查看幻灯片并观看Unity GDC 展位演讲 - 移动设备上的特大城市:下面我们如何利用Adaptive Performance对其进行优化。

与三星合作开发Adaptive Performance

我们与全球最大的 Android 移动设备制造商三星合作,帮助实现这一解决方案。Adaptive Performance基于三星的 GameSDK 构建,将首先适用于三星 Galaxy S10 和 Galaxy Fold 等三星 Galaxy 设备,随后在今年晚些时候适用于其他三星 Galaxy 设备。

早期成果

这些图表(在我们 于 GDC 2019 举行的Unity主题演讲中展示)说明了Adaptive Performance如何帮助在新款三星 Galaxy S10 上运行的 Megacity 提供稳定的高帧速率。

帧率图像

红色部分是我们添加Adaptive Performance之前 Megacity 中的帧速率;蓝色部分是我们添加Adaptive Performance之后的结果。借助Adaptive Performance,演示可以以 30 fps 的速度运行更长时间,并且更加稳定。

为什么是特大城市?
图片来自 Megacity

特大城市是一座具有未来感的互动城市,拥有数百万个实体,展示了Unity如何在当前一代移动硬件上运行最复杂的项目。它展示了我们面向数据的技术堆栈(DOTS)的最新进展,这是我们“默认性能”旗帜下所有项目的名称,包括实体组件系统(ECS)、本机Collections、C# 作业系统和Burst编译器。Megacity 首次在 2018 年洛杉矶 Unite 大会 上亮相,并在 2019 年 GDC期间发布了桌面版本。

巨型城市是一个展示Adaptive Performance示例实现的合适项目,因为它为我们提供了灵活性,可以动态、主动地调整游戏,以最佳地利用硬件。Adaptive Performance的构建充分考虑了可扩展性,这与用于构建特大城市基础的 DOTS 原则完美契合。

该项目的移动版本拥有 450 万个网格渲染器、20 万个建筑组件、10 万个音频源和超过 600 万个实体,是展示 Adaptive Performance 功能的理想选择。

Adaptive Performance如何发挥作用(在特大城市)

通过Unity软件包管理器安装Adaptive Performance后,当您在设备上构建项目时, Unity会自动将 Samsung GameSDK 子系统添加到您的项目中。在运行时, Unity会在支持的设备上创建并启动Adaptive Performance管理器,为您提供有关移动设备热状态的反馈。您可以在运行时订阅事件或从Adaptive Performance管理器查询信息以实时做出反应;否则,它只会将统计信息报告给控制台。

举例来说,您可以使用提供的API来创建对设备上的热趋势和事件做出反应的应用程序。这可确保较长时间内保持恒定的帧速率,同时避免热节流,甚至在节流开始之前。在《Megacity》的Adaptive Performance示例实现中,我们使用了三种不同的方式来平滑帧率:

  • 通过从中等的 CPU 和 GPU 水平开始,并逐渐提高它们以消除瓶颈,我们能够保持较低的能耗。
  • 如果我们发现设备即将达到节流极限,我们可以调整质量设置来降低热负荷 - 我们决定降低LOD级别。
  • 一旦接近节流,我们也会降低目标帧速率。
  • 当达到目标帧速率且温度下降时,我们增加LOD级别,提高目标帧速率,并再次降低 CPU 和 GPU 级别。

这些功能使您的游戏能够随着时间的推移实现更流畅的性能。通过密切关注设备的热趋势,您可以动态调整性能设置,以避免完全限制。

在此下载 Megacity 移动示例项目,了解我们是如何做到的。如对 Megacity 有任何反馈或疑问,请访问此论坛 主题

Adaptive Performance管理器

该软件包的核心是Adaptive Performance管理器,它在Unity启动时创建,允许您轻松访问和订阅热和性能事件通知。下面的示例展示了如何使用MonoBehaviour的 Start 函数中的 IAdaptivePerformance 接口访问Adaptive Performance管理器。

private IAdaptivePerformance ap = null;

void Start()
{
ap = Holder.instance;
}

热事件

每当设备的热状态发生变化时, Unity就会发送热事件。重要的状态是节流即将发生时和节流正在发生时。在下面的示例中,您订阅 ThermalEvents 来减少或增加 lodBias,这有助于减少 GPU 负载。

using UnityEngine;
using UnityEngine.Mobile.AdaptivePerformance;

公共类AdaptiveLOD:MonoBehaviour
{
private IAdaptivePerformance ap = null;

void Start() {
如果(Holder.instance == null)
return;

ap = Holder.instance;

如果(!ap.active)
return;

QualitySettings.lodBias = 1;

ap.ThermalEvent += OnThermalEvent;
}

void OnThermalEvent(object obj, ThermalEventArgs ev) {
switch (ev.warningLevel) {
情况 PerformanceWarningLevel.NoWarning:
QualitySettings.lodBias = 1;
break;
案例 PerformanceWarningLevel.ThrottlingImminent:
QualitySettings.lodBias = 0.75f;
break;
案例 PerformanceWarningLevel.Throttling:
QualitySettings.lodBias = 0.5f;
break;
}
}
}

请注意,如果将 lodBias 降低到 1 以下,在许多情况下会产生视觉影响,并且可能会发生LOD对象弹出,但如果游戏体验不需要它,这是一种减少图形负载的简单方法。如果您想要做出更详细的决定来微调游戏的图形和行为的处理方式,瓶颈事件非常有用。

CPU 和 GPU 性能级别

移动设备的CPU和GPU占其耗电量的很大一部分,尤其是在运行游戏时。通常,操作系统决定 CPU 和 GPU 使用哪种时钟速度。

CPU 核心和 GPU 在以最大时钟速度运行时效率较低。以高时钟速度运行很容易导致移动设备过热,操作系统会限制 CPU 和 GPU 的频率来冷却设备。

您可以通过以下属性限制最大允许时钟速度来避免这种情况:

  • IAdaptivePerformance.cpuLevel
  • IAdaptivePerformance.gpuLevel

应用程序可以根据其对当前性能要求的特殊知识来配置这些属性,并根据场景决定是否应降低或提高级别。

  • 应用程序在前几帧中是否达到了目标帧速率?
  • 该应用程序是在游戏场景中还是在菜单中?
  • 接下来会有激烈的场面吗?
  • 即将举行的活动 CPU 或 GPU 占用是否很大?
  • 您会展示不需要高 CPU/GPU 水平的广告吗?

公共无效输入菜单(){
如果(!ap.active)
return;

// 在菜单中设置低 CPU 和 GPU 级别
ap.cpuLevel = 0;
ap.gpuLevel = 0;
// 设置低目标FPS
Application.targetFrameRate = 15;
}

public void ExitMenu(){
// 返回游戏时设置更高的 CPU 和 GPU 级别
ap.cpuLevel = ap.maxCpuPerformanceLevel;
ap.gpuLevel = ap.maxGpuPerformanceLevel;
}

性能瓶颈预警系统

在Adaptive Performance管理器中,您可以订阅接收性能瓶颈事件,以便了解您是否受到 GPU、CPU 或“帧速率限制”。帧率限制意味着游戏受到Application.targetFrameRate的限制,在这种情况下应用程序应该考虑降低其性能要求。

在后台运行的管理瓶颈决策(可通过管理器查询)是 GPU 帧时间驱动程序,它监视 GPU 在最后一帧上花费的硬件时间;目前,CPU 时间是通过对 Unity 的内部子系统求和来计算的。根据游戏和场景,当游戏受到 CPU 或 GPU 限制时,您可以让它根据热状态变化做出不同的反应。

void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) {
开关(ev.瓶颈){
案例 PerformanceBottleneck.TargetFrameRate:
if (ap.cpuLevel > 0) {
ap.cpuLevel--;
}
if (ap.gpuLevel > 0) {
ap.gpuLevel--;
}
break;
案例 PerformanceBottleneck.GPU:
if (ap.gpuLevel < ap.maxGpuPerformanceLevel) {
ap.gpuLevel++;
}
break;
案例性能瓶颈.CPU:
if (ap.cpuLevel < ap.maxCpuPerformanceLevel) {
ap.cpuLevel++;
}
break;
}
}

优化游戏的方法有很多种,上述示例和 Megacity 中的示例仅提供了一些建议;最终,这在很大程度上取决于哪种方法最适合您的游戏。欲了解更多信息,请检查包 文档

Adaptive Performance的下一步是什么

这仅仅是一个开始!我们将继续投资于Adaptive Performance,随着时间的推移增加更多功能并支持更多设备。当前软件包包含一个低级API,但我们已经在开发与 DOTS兼容的高级、基于组件的API ,这将使您更容易在Unity项目中调整性能。请继续关注更多信息。

立即开始

现在可以通过Unity包管理器为Unity 2019.1(测试版)提供Adaptive Performance的预览版。您可以 在此处访问。要了解有关Adaptive Performance的最新信息、了解其他开发人员如何使用它以及发布问题或评论,请访问 论坛