从 Android 15 开始,自适应刷新率 (ARR) 功能支持显示屏刷新率根据内容帧率进行调整,并使用离散 VSync 步长。
ARR 功能具有以下优势
降低功耗:默认情况下,ARR 使设备能够以低于其最大刷新率的速率运行,仅在用户体验必不可少时才过渡到更高的速率,从而最大限度地减少不必要的功耗。
减少卡顿:ARR 消除了模式切换的需要,而模式切换是造成卡顿的已知原因。
概览
在非 ARR 面板上,显示屏以由活动显示模式确定的固定节奏刷新。
在 ARR 面板上,显示屏 VSync 速率和刷新率是解耦的,允许刷新率在一个显示模式内根据内容更新节奏进行更改。面板可以以面板撕裂效果 (TE) 的除数的刷新率运行。OEM 可以根据其首选的功耗权衡来实现 ARR。
下图是一个 vsyncPeriod
为 240 Hz 且 minFrameIntervalNs
(最大刷新率)为 120 Hz 的显示屏。VSync 每 4.16 毫秒发生一次。帧可以在上次帧之后的 minFrameIntervalNs
之后以 VSync 的任意倍数呈现。
图 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 包括以下属性
minFrameIntervalNs
:显示屏可以支持的最大刷新率。NotifyExpectedPresentConfig
:这由显示屏何时需要即将到来的帧的提前通知来确定。
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 所示
图 2. TouchLatency 测试应用程序。
在测试应用程序中,使用滑块将渲染率调整为显示屏刷新率的各个除数刷新率值。 观察帧速率如何相对于请求的速率变化。