VSYNC 信号は、ディスプレイ パイプラインを同期します。ディスプレイ パイプラインは、アプリによるレンダリング、SurfaceFlinger による合成、Hardware Composer(HWC)によるディスプレイでの画像表示で構成されます。VSNC は、アプリが復帰してレンダリングを開始する時間、SurfaceFlinger が復帰して画面を合成する時間、ディスプレイのリフレッシュ周期を同期します。この同期により、途切れがなくなり、グラフィックスの視覚的なパフォーマンスが向上します。
HWC は VSYNC イベントを生成し、そのイベントを以下のコールバックを通じて SurfaceFlinger に送ります。
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger は、setVsyncEnabled
を呼び出すことにより、HWC が 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 からの撤退フェンス(retire fence)の信号タイムスタンプ
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 合成や、Chrome でアニメーションを含むウェブページをスクロールする場合など、負荷の高いユースケースに基づく余裕のある値が設定されます。このオフセットにより、アプリのレンダリング時間と GPU の合成時間に余裕が生まれます。
レイテンシは 1 ミリ秒または 2 ミリ秒を超えると目立つようになります。エラー数を大幅に増やすことなくレイテンシを最小限に抑えるには、自動エラーテストを行って統合します。