リフレッシュ レートの自動調整

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 の任意の倍数で表示できます。

arr-example

図 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 ミリ秒の frameIntervalNsnotifyExpectedPresent が呼び出される場合、表示時刻 N 後の次のフレームは N + 16.6 ミリ秒です。表示時刻 N 以降、新たな変更があるまでフレーム頻度は 16.6 ミリ秒になります。

IComposerClient.notifyExpectedPresent は、DisplayConfiguration.notifyExpectedPresentConfig が設定されており、次のタイミング条件を満たした場合にのみ呼び出されます。

  • 頻度外表示時刻: frameIntervalNs に定義されるディスプレイの通常のリフレッシュ レートが、次のフレームの想定される表示時刻から外れています。
  • 超過タイムアウト: 前のフレームの時間間隔が notifyExpectedPresentConfig.timeoutNs 以上です。

DisplayCommand.frameIntervalNs

DisplayCommand.frameIntervalNs は、次のフレームの頻度についてナノ秒単位でヒントを提供します。

テスト

デバッグに onRefreshRateChangedDebug を使用します。このメソッドは、クライアントにディスプレイのリフレッシュ レートが変わったことを通知します。

図 2 に示すように、TouchLatency テストアプリを手動テストに使用します。

touchlatency-app

図 2. TouchLatency テストアプリ。

テストアプリでスライダーを使用して、ディスプレイのリフレッシュ レートにおける除数のリフレッシュ レートのさまざまな値にレンダリング率を調整します。リクエストされるレートに応じてフレームレートがどのように変化するかを確認します。