Android 15 以降、リフレッシュ レートの自動調整(ARR)機能により、個別の VSync の手順でディスプレイのリフレッシュ レートをコンテンツのフレームレートに合わせることができます。
ARR 機能には次のような利点があります。
電力消費量の軽減: デフォルトで ARR 機能は、デバイスが最大リフレッシュ レートよりも低いレートで動作し、ユーザー エクスペリエンスのために必要な場合にのみ高いレートに切り替わるようにします。これにより不要な電力消費を最小限に抑えます。
ジャンクの削減: ARR 機能により、ジャンクの既知の原因であるモード切り替えが不要になります。
概要
非 ARR パネルでは、アクティブ状態のディスプレイ モードによって決められた固定の頻度でディスプレイが更新されます。
ARR パネルでは、ディスプレイの VSync レートとリフレッシュ レートが切り離され、コンテンツの更新頻度に基づきリフレッシュ レートが 1 つのディスプレイ モード内で変化します。パネルは、パネルのテアリング現象(TE)の除数であるリフレッシュ レートで動作できます。OEM は、希望する電力トレードオフに基づいて自由に ARR を実装できます。
次の図は、vsyncPeriod
が 240 Hz、minFrameIntervalNs
(最大リフレッシュ レート)が 120 Hz のディスプレイです。VSync は、4.16 ミリ秒ごとに発生します。フレームは、最後のフレームから minFrameIntervalNs
後に VSync の任意の倍数で表示できます。
図 1. ARR の例。
実装
Android 15 は、新しい Hardware Composer(HWC)HAL API とプラットフォームの変更により ARR をサポートします。ARR を有効にするには、以降のセクションに記載するように、OEM が Andoid 15 以降を搭載するデバイスでカーネルとシステムの変更をサポートし、バージョン 3 の android.hardware.graphics.composer3
API を実装する必要があります。
詳しくは、ARR をサポートする API の Google Pixel のリファレンス実装をご覧ください。
DisplayConfiguration.aidl
DisplayConfiguration.aidl
API は、次の ARR の属性とともに、ディスプレイの属性を使用してディスプレイ構成を指定します。
- 任意の
vrrConfig
: 設定されている場合、ARR は特定の構成で有効になります。null
に設定すると、ディスプレイ モードは、複数のリフレッシュ レート(MRR)などの非 ARR モードに設定されます。この属性を使うと 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
の後の表示頻度を表します。たとえば、N の expectedPresentTime
と 16.6 ミリ秒の frameIntervalNs
で notifyExpectedPresent
が呼び出される場合、表示時刻 N 後の次のフレームは N + 16.6 ミリ秒です。表示時刻 N 以降、新たな変更があるまでフレーム頻度は 16.6 ミリ秒になります。
IComposerClient.notifyExpectedPresent
は、DisplayConfiguration.notifyExpectedPresentConfig
が設定されており、次のタイミング条件を満たした場合にのみ呼び出されます。
- 頻度外表示時刻:
frameIntervalNs
に定義されるディスプレイの通常のリフレッシュ レートが、次のフレームの想定される表示時刻から外れています。 - 超過タイムアウト: 前のフレームの時間間隔が
notifyExpectedPresentConfig.timeoutNs
以上です。
DisplayCommand.frameIntervalNs
DisplayCommand.frameIntervalNs
は、次のフレームの頻度についてナノ秒単位でヒントを提供します。
テスト
デバッグに onRefreshRateChangedDebug
を使用します。このメソッドは、クライアントにディスプレイのリフレッシュ レートが変わったことを通知します。
図 2 に示すように、TouchLatency
テストアプリを手動テストに使用します。
図 2. TouchLatency テストアプリ。
テストアプリでスライダーを使用して、ディスプレイのリフレッシュ レートにおける除数のリフレッシュ レートのさまざまな値にレンダリング率を調整します。リクエストされるレートに応じてフレームレートがどのように変化するかを確認します。