自适应刷新率

从 Android 15 开始,自适应刷新率 (ARR) 功能支持显示屏刷新率根据内容帧率进行调整,并使用离散 VSync 步长。

ARR 功能具有以下优势

  • 降低功耗:默认情况下,ARR 使设备能够以低于其最大刷新率的速率运行,仅在用户体验必不可少时才过渡到更高的速率,从而最大限度地减少不必要的功耗。

  • 减少卡顿:ARR 消除了模式切换的需要,而模式切换是造成卡顿的已知原因。

概览

在非 ARR 面板上,显示屏以由活动显示模式确定的固定节奏刷新。

在 ARR 面板上,显示屏 VSync 速率和刷新率是解耦的,允许刷新率在一个显示模式内根据内容更新节奏进行更改。面板可以以面板撕裂效果 (TE) 的除数的刷新率运行。OEM 可以根据其首选的功耗权衡来实现 ARR。

下图是一个 vsyncPeriod 为 240 Hz 且 minFrameIntervalNs(最大刷新率)为 120 Hz 的显示屏。VSync 每 4.16 毫秒发生一次。帧可以在上次帧之后的 minFrameIntervalNs 之后以 VSync 的任意倍数呈现。

arr-example

图 1. ARR 示例。

实现

Android 15 通过新的硬件合成器 (HWC) HAL API 和平台变更来支持 ARR。为了启用 ARR,OEM 必须支持运行 Android 15 及更高版本的设备上的内核和系统变更,并实现版本 3 的 android.hardware.graphics.composer3 API(如下节中所列)。

如需了解详情,请参阅 Pixel 的参考实现,其中提供了支持 ARR 的 API。

DisplayConfiguration.aidl

The DisplayConfiguration.aidl API 使用显示属性以及 ARR 的以下属性来指定显示配置

  • 可选的 vrrConfig:如果设置,则为特定配置启用 ARR。 如果设置为 null,则显示模式设置为非 ARR 模式,例如多刷新率 (MRR)。 使用此属性,可以将显示配置为 MRR 或 ARR,但不能同时配置为两者。
  • vsyncPeriod:显示屏的 VSync 速率。 在 ARR 显示屏上,此值用于导出支持的离散刷新率。

    供应商必须为所有设备设置 DisplayConfiguration.vsyncPeriod 值。 对于非 ARR 显示屏,DisplayConfiguration.vsyncPeriod 是显示屏刷新率。 如果设备支持 120 Hz,则此值必须为 8.3 毫秒。

    对于 ARR 显示屏,DisplayConfiguration.vsyncPeriod 是 TE 信号频率。 如果设备的 minFrameIntervalNs 为 8.3 毫秒,但 TE 为 240 Hz,则此值必须为 4.16 毫秒。

VrrConfig.aidl

The VrrConfig.aidl API 包括以下属性

IComposerClient.notifyExpectedPresent 为可能要呈现的帧提供提示,以便显示屏可以相应地调整其自刷新周期。frameIntervalNs 表示在 expectedPresentTime 之后呈现的节奏。 例如,如果使用 expectedPresentTime N 和 16.6 毫秒的 frameIntervalNs 调用 notifyExpectedPresent,则下一帧在呈现时间 N 之后的 N + 16.6 毫秒处。 在呈现时间 N 之后,帧节奏为 16.6 毫秒,直到有进一步的变化。

仅当设置了 DisplayConfiguration.notifyExpectedPresentConfig 并且发生以下定时条件之一时,才会调用 IComposerClient.notifyExpectedPresent

  • 超出节奏的呈现时间:下一帧的预期呈现时间偏离了由 frameIntervalNs 定义的显示屏的常规刷新率。
  • 超时:先前帧之间的时间间隔大于或等于 notifyExpectedPresentConfig.timeoutNs

DisplayCommand.frameIntervalNs

DisplayCommand.frameIntervalNs 提供有关即将到来的帧的节奏(以纳秒为单位)的提示。

测试

使用 onRefreshRateChangedDebug 进行调试。 此方法通知客户端显示屏的刷新率已更改。

使用 TouchLatency 测试应用程序进行手动测试,如图 2 所示

touchlatency-app

图 2. TouchLatency 测试应用程序。

在测试应用程序中,使用滑块将渲染率调整为显示屏刷新率的各个除数刷新率值。 观察帧速率如何相对于请求的速率变化。