VSYNC 信号はディスプレイ パイプラインを同期します。ディスプレイ パイプラインは、アプリのレンダリング、SurfaceFlinger 合成、およびディスプレイ上に画像を表示するハードウェア コンポーザー (HWC) で構成されます。 VSYNC は、アプリがレンダリングを開始するために起動する時間、SurfaceFlinger が画面を合成するために起動する時間、および表示の更新サイクルを同期します。この同期により途切れが解消され、グラフィックスの視覚的なパフォーマンスが向上します。
HWC は VSYNC イベントを生成し、コールバックを通じてそのイベントを SurfaceFlinger に送信します。
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger は、HWC がsetVsyncEnabled
を呼び出して VSYNC イベントを生成するかどうかを制御します。 SurfaceFlinger により、 setVsyncEnabled
VSYNC イベントを生成できるようになり、ディスプレイのリフレッシュ サイクルと同期できるようになります。 SurfaceFlinger が表示更新サイクルに同期されると、SurfaceFlinger はsetVsyncEnabled
を無効にして、HWC による VSYNC イベントの生成を停止します。 SurfaceFlinger が実際の VSYNC と以前に確立された VSYNC との差を検出した場合、SurfaceFlinger は VSYNC イベントの生成を再度有効にします。
VSYNCオフセット
同期アプリと SurfaceFlinger はハードウェア VSYNC にループをレンダリングします。 VSYNC イベントでは、ディスプレイはフレームNの表示を開始し、SurfaceFlinger はフレームN+1のウィンドウの合成を開始します。アプリは保留中の入力を処理し、フレームN+2を生成します。
VSYNC と同期すると、一貫したレイテンシーが実現します。これにより、アプリと SurfaceFlinger でのエラーが減少し、ディスプレイの相互の位相のずれや同位相のずれが最小限に抑えられます。これは、アプリと SurfaceFlinger のフレームごとの時間が大きく変わらないことを前提としています。遅延は少なくとも 2 フレームです。
これを解決するには、VSYNC オフセットを使用して、アプリとコンポジション信号をハードウェア VSYNC に対して相対的にすることで、入力からディスプレイまでの遅延を短縮できます。これは、アプリと合成にかかる時間が通常 33 ミリ秒未満であるため可能です。
VSYNC オフセットの結果は、同じ周期とオフセット位相を持つ 3 つの信号になります。
-
HW_VSYNC_0
— ディスプレイは次のフレームの表示を開始します。 -
VSYNC
— アプリは入力を読み取り、次のフレームを生成します。 -
SF_VSYNC
— SurfaceFlinger は次のフレームの合成を開始します。
VSYNC オフセットを使用すると、SurfaceFlinger はバッファーを受信してフレームを合成し、同時にアプリが入力を処理してフレームをレンダリングします。
DispSync
DispSync は、ディスプレイの定期的なハードウェア ベースの VSYNC イベントのモデルを維持し、そのモデルを使用してハードウェア VSYNC イベントからの特定の位相オフセットでコールバックを実行します。
DispSync は、ハードウェア VSYNC からオフセットされていない場合でも、Choreographer および SurfaceFlinger で使用される VSYNC および SF_VSYNC 信号を生成するソフトウェア フェーズ ロック ループ (PLL) です。
DispSync には次のような特長があります。
- 参照— HW_VSYNC_0。
- 出力- VSYNC および SF_VSYNC。
- フィードバック— Hardware Composer からフェンス信号のタイムスタンプを廃止します。
VSYNC/リタイアオフセット
リタイア フェンスの信号タイムスタンプは、オフセット位相を使用しないデバイスであっても、HW VSYNC と一致する必要があります。そうしないと、エラーが実際よりも深刻に見えます。スマート パネルには多くの場合、リタイア フェンスが表示メモリへのダイレクト メモリ アクセス (DMA) の終わりであるデルタがありますが、実際の表示の切り替えと HW VSYNC はしばらく後になります。
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
は、デバイスのBoardConfig.mk
makefile で設定されます。これはディスプレイ コントローラーとパネルの特性に基づいています。リタイア フェンス タイムスタンプから HW VSYNC 信号までの時間はナノ秒単位で測定されます。
VSYNC および SF_VSYNC オフセット
VSYNC_EVENT_PHASE_OFFSET_NS
とSF_VSYNC_EVENT_PHASE_OFFSET_NS
は、ウィンドウ遷移中の部分的な GPU 合成やアニメーションを含む Web ページの Chrome スクロールなど、高負荷のユースケースに基づいて保守的に設定されています。これらのオフセットにより、アプリのレンダリング時間と GPU 構成時間が長くなります。
1 ~ 2 ミリ秒を超える遅延が顕著です。エラー数を大幅に増やすことなく遅延を最小限に抑えるには、徹底的な自動エラー テストを統合します。