从 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 及更高版本的设备上的内核和系统更改,并实现 android.hardware.graphics.composer3
API 版本 3,如以下部分所列。
如需了解详情,请参阅支持 ARR 的 API 的 Pixel 参考实现。
DisplayConfiguration.aidl
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
VrrConfig.aidl
API 包含以下属性:
minFrameIntervalNs
:显示屏支持的最大刷新率。NotifyExpectedPresentConfig
:这取决于显示屏需要何时提前通知即将显示的帧。
IComposerClient.notifyExpectedPresent
会针对可能呈现的帧提供提示,以便显示屏相应地调整其自刷新周期。frameIntervalNs
表示 expectedPresentTime
后面的当前节奏。例如,如果以 expectedPresentTime
N 和 frameIntervalNs
16.6 毫秒调用 notifyExpectedPresent
,则下一帧位于当前时间 N 之后 N + 16.6 毫秒。在当前时间 N 之后,帧速率为 16.6 毫秒,直至发生进一步更改。
仅当设置了 DisplayConfiguration.notifyExpectedPresentConfig
且发生以下时序条件之一时,系统才会调用 IComposerClient.notifyExpectedPresent
:
- 不同步呈现时间:下一帧的预期呈现时间与由
frameIntervalNs
定义的显示屏的常规刷新频率相差。 - 超时:前帧之间的时间间隔大于或等于
notifyExpectedPresentConfig.timeoutNs
。
DisplayCommand.frameIntervalNs
DisplayCommand.frameIntervalNs
提供了有关后续帧的节奏的提示(以纳秒为单位)。
测试
使用 onRefreshRateChangedDebug
进行调试。此方法会通知客户端显示屏的刷新频率已更改。
使用 TouchLatency
测试应用进行手动测试,如图 2 所示:
图 2. TouchLatency 测试应用。
在测试应用中,使用滑块将渲染速率调整为显示屏刷新率的各种除数刷新率值。观察帧速率相对于请求的速率的变化情况。