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

Android 15 以降では、適応型リフレッシュ レート(ARR)機能により、ディスプレイのリフレッシュ レートをディスクリートな VSync ステップを使用してコンテンツのフレームレートに適応させることができます。

ARR 機能には次のような利点があります。

  • 消費電力の削減: デフォルトでは、ARR によりデバイスは最大リフレッシュ レートよりも低いレートで動作し、ユーザー エクスペリエンスに不可欠な場合にのみ高いレートに移行するため、不要な消費電力を最小限に抑えることができます。

  • ジャンクの軽減: ARR を使用すると、ジャンクの原因として知られているモード切り替えが不要になります。

概要

ARR 以外のパネルでは、ディスプレイはアクティブなディスプレイ モードによって決まる一定の頻度で更新されます。

ARR パネルでは、ディスプレイの VSync レートとリフレッシュ レートが分離されているため、コンテンツの更新頻度に基づいて、1 つのディスプレイ モード内でリフレッシュ レートを変更できます。パネルは、パネルのティアリング効果(TE)の除算子であるリフレッシュ レートで実行できます。OEM は、優先する電力のトレードオフに基づいて ARR を柔軟に実装できます。

次の図は、vsyncPeriod が 240 Hz、minFrameIntervalNs(最大リフレッシュ レート)が 120 Hz のディスプレイを示しています。VSync は 4.16 ms ごとに発生します。フレームは、最後のフレームの minFrameIntervalNs の後に VSync の任意の倍数で表示できます。

arr-example

図 1. ARR の例。

実装

Android 15 では、新しい Hardware Composer(HWC)HAL API とプラットフォームの変更により、ARR がサポートされています。ARR を有効にするには、OEM は Android 15 以降を搭載したデバイスでカーネルとシステムの変更をサポートし、次のセクションに記載されているように android.hardware.graphics.composer3 API バージョン 3 を実装する必要があります。

詳細については、ARR をサポートする API の Google Pixel のリファレンス実装をご覧ください。

DisplayConfiguration.aidl

DisplayConfiguration.aidl API は、ディスプレイ属性と ARR の次の属性を使用してディスプレイ構成を指定します。

  • 省略可の vrrConfig: 設定すると、特定の構成で ARR が有効になります。null に設定すると、ディスプレイ モードは マルチ更新レート(MRR)などの ARR 以外のモードに設定されます。この属性を使用すると、ディスプレイは MRR または ARR のいずれかとして構成できますが、両方を構成することはできません。
  • vsyncPeriod: ディスプレイの VSync レート。ARR ディスプレイでは、この値は、サポートされている個別のリフレッシュ レートを導出するために使用されます。

    ベンダーは、すべてのデバイスに DisplayConfiguration.vsyncPeriod 値を設定する必要があります。AAR 以外のディスプレイの場合、DisplayConfiguration.vsyncPeriod はディスプレイのリフレッシュ レートです。デバイスが 120 Hz をサポートしている場合、この値は 8.3 ms にする必要があります。

    ARR ディスプレイの場合、DisplayConfiguration.vsyncPeriod は TE 信号の周波数です。デバイスの minFrameIntervalNs が 8.3 ms で、TE が 240 Hz の場合、この値は 4.16 ms である必要があります。

VrrConfig.aidl

VrrConfig.aidl API には次の属性があります。

  • minFrameIntervalNs: ディスプレイがサポートできる最大リフレッシュ レート。
  • NotifyExpectedPresentConfig: ディスプレイが次のフレームの事前通知を必要とするタイミングによって決まります。

IComposerClient.notifyExpectedPresent は、表示される可能性が高いフレームのヒントを提供します。これにより、ディスプレイはそれに応じて自己更新期間を調整できます。frameIntervalNs は、expectedPresentTime の後に続く現在のケイデンスを表します。たとえば、expectedPresentTime N と frameIntervalNs が 16.6 ms で notifyExpectedPresent が呼び出されると、次のフレームは現在の時刻 N の N + 16.6 ms になります。現在の時刻 N 以降、フレーム ケイデンスは、変更が加えられない限り 16.6 ms です。

IComposerClient.notifyExpectedPresent は、DisplayConfiguration.notifyExpectedPresentConfig が設定され、次のタイミング条件のいずれかが発生した場合にのみ呼び出されます。

  • 非ケイデンス プレゼンス時間: 次のフレームの予想プレゼンス時間が、frameIntervalNs で定義されたディスプレイの通常の更新レートから逸脱している。
  • タイムアウト時間超過: 前のフレーム間の時間間隔が notifyExpectedPresentConfig.timeoutNs 以上です。

DisplayCommand.frameIntervalNs

DisplayCommand.frameIntervalNs は、今後のフレームのケイデンス(ナノ秒単位)に関するヒントを提供します。

テスト

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

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

touchLatency アプリ

図 2. TouchLatency テストアプリ。

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