Performance Hint API | Android game development | Android Developers (google.cn)
ADPF 是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。借助这些 API,您可以监控 Android 系统上的动态行为,在不造成设备过热问题的可持续界限内优化游戏性能。
与桌面设备和游戏机相比,移动 SoC 和 Android 具有更多的动态性能行为。这些行为包括热状态管理、不同的 CPU 时钟和不同的 CPU 核心类型。再加上 SoC 核心拓扑日益多样化,这给尝试确保您的游戏能够利用这种行为而不对设备性能产生负面影响时带来了挑战。ADPF 提供其中一些信息是为了提高性能的可预测性。
以下是主要的 ADPF 功能:
- Thermal API:监控设备的热状态,以便应用在工作负载变得不可持续之前主动调整工作负载。
- 已发布:
- Android 11(API 级别 30)- Thermal API
- Android 12(API 级别 31)- NDK API
- (预览版)Android 15 (DP1) - getThermalHeadroomThresholds()
- 应用的潜在性能受设备热状态的限制,热状态可能会因天气、近期使用情况以及设备热设计等特性而异。设备只能维持较高的 在一段有限的时间里确保性能,然后才会受到温控。实现的关键目标是在不超出热限制的情况下实现性能目标。Thermal API 让这一切无需您 进行设备特定的优化此外,在调试性能时 设备热状态是否会限制性能 非常重要。
- 游戏引擎通常具有运行时性能参数,可以调整引擎对设备施加的工作负载。例如,这些参数可以设置 工作器线程数、大小核心的工作器线程亲和性、 GPU 保真度选项和帧缓冲区分辨率。在 Unity Engine 中,游戏 开发者可以通过更改 设置 使用 Adaptive Performance 插件。 对于 Unreal Engine,请使用可伸缩性设置来调整 动态地调整质量级别。
- 当设备接近不安全的热状态时,您的游戏可以通过借助这些参数降低工作负载来避免受到限制。为避免受到限制,您应监控设备的热状态并主动调整游戏引擎工作负载。一旦设备过热,工作负载必须 降至可持续的性能水平以下,以便散热。更新后 热余量降低到更安全的水平,游戏可以提高 但务必找到可持续的质量水平 以获得最佳游戏时间。
- 您可以通过轮询 getThermalHeadroom 方法来监控设备的热状态。此方法可预测设备可以保持当前状态多长时间 性能水平不会过热如果时间低于运行工作负载所需的时间量,您的游戏应将工作负载降低到可持续水平。例如,游戏可以切换到较小的核心、降低帧速率或降低保真度。
- CPU Performance Hint API:提供性能提示,让 Android 能够为工作负载选择合适的性能设置(例如 CPU 操作点或核心)。
已发布:
Android 12(API 级别 31)- Performance Hint API
Android 13(API 级别 33)- NDK API 中的性能提示管理器
(预览版)Android 15 (DP1) - reportActualWorkDuration()
通过 CPU 性能提示,游戏可能会影响动态 CPU 性能 更好地满足其需求。在大多数设备上,Android 会动态调整 根据之前的需求确定工作负载的 CPU 时钟速度和核心类型。 如果工作负载使用的 CPU 资源较多,那么时钟速度会加快, 工作负载最终会移至更大的核心。如果工作负载使用 那么 Android 会减少资源分配。借助 ADPF,应用 或者游戏可以发送有关其性能和截止时间的额外信号。本次 有助于系统更积极地磨合(改善性能),并降低 在工作负载完成后迅速启动(节省电量)。
时钟速度
当 Android 设备动态调整其 CPU 时钟速度时,频率可以 更改代码的性能设计处理动态时钟的代码 速度对于最大限度地提高性能、保持安全 以及高效利用电力。您无法直接分配 CPU 频率 。因此,应用尝试以更高的性能运行的常见方式是 CPU 时钟速度是在后台线程中运行繁忙循环,因此工作负载 要求越来越高这是一种不良做法,因为它不仅浪费电量,还会增加 设备上的热负载(当应用实际上并未使用 资源。CPU PerformanceHint
API 就旨在解决此问题。修改者 告知系统实际工作时长和目标工作时长, Android 将能够获取应用的 CPU 需求概览,并为应用分配 资源。这将有助于在高效能耗下实现最佳性能 消费水平。
核心类型
运行游戏的 CPU 核心类型是影响性能的另一项重要因素。Android 设备通常会根据近期的工作负载行为动态更改分配给线程的 CPU 核心。在具有多个核心类型的 SoC 上,CPU 核心分配会更加复杂。在某些此类设备上,较大的核心仅供短暂使用,而不会陷入热不可持续状态。
您的游戏不应出于以下原因尝试设置 CPU 核心亲和性:
- 工作负载的最佳核心类型因设备型号而异。
- 运行较大核心的可持续性因 SoC 和每个设备型号提供的不同散热解决方案而异。
- 对热状态的环境影响可能使核心选择变得更加复杂。例如,天气或手机壳可能会改变设备的热状态。
- 核心选择无法适应具有额外的性能和散热功能的新设备。因此,设备通常会忽略游戏的处理器亲和性。
默认 Linux 调度程序行为示例
图 1. 调节器可能需要大约 200 毫秒的时间来增加或降低 CPU 频率。ADPF 与动态电压和频率调节系统 (DVFS) 搭配使用,可实现最佳的单位能耗性能
PerformanceHint API 提取的不仅仅是 DVFS 延迟时间
图 2. ADPF 知道如何代表您做出最佳决定<ph type="x-smartling-placeholder">
</ph>
- 如果任务需要在特定的 CPU 上运行,PerformanceHint API 知道如何 并代您做出决定。
- 因此,您无需使用亲和性。
- 设备附带各种拓扑;电源和散热特性 过于多样化,无法提供给应用开发者。
- 您不能对运行应用的底层系统做出任何假设。
解决方案
ADPF 提供 PerformanceHintManager, 类,以便游戏可以向 Android 发送性能提示,以了解 CPU 时钟速度和 核心类型。然后,操作系统可以根据设备的 SoC 和散热解决方案决定如何充分利用这些提示。如果您的应用将此 API 与热状态监控功能结合使用,则可以为操作系统提供更明智的提示,而无需使用忙循环和其他可能导致受限制的编码方法。
游戏使用性能提示的方式如下:
- 针对行为相似的关键线程创建提示会话。例如:
- 呈现线程及其依赖项获取一个会话 <ph type="x-smartling-placeholder">
</ph>
-
-
- 在 Cocos 中,主线程线程和渲染线程分别是 会话
- 在 Unity 中,集成 Adaptive Performance Android Provider 插件
- 在 Unreal 中,集成 Unreal Adaptive Performance 插件并使用 可扩缩性选项:支持多个质量级别
- IO 线程获得另一会话
- 音频会话获得第三个会话
-
- 游戏应尽早执行此操作,至少要比会话需要更多系统资源的时间提前 2 毫秒(最好超过 4 毫秒)。
- 在每个提示会话中,预测每个会话运行所需的时长。典型时长相当于帧间隔,但应用可以使用 则间隔会变短。
- Game Mode API 和 Game State API:根据用户的设置和游戏专用配置,通过确定性能或电池续航时间特征的优先级来启用游戏优化功能。
- 固定性能模式:在进行基准测试期间在设备上启用固定性能模式,以获取不会因动态 CPU 时钟设置而更改的测量结果。
- 节能模式:告知会话可以安全地安排性能提示会话中的线程,使其优先考虑节能而非性能。(适用于 Android 15)