このことを理解するには、「トリプルバッファリングの必要性」セクションと関連する図 (理想的にはアニメーション GIF) に特に注意しながら、システム レベル グラフィックス アーキテクチャドキュメントから始めるのが最善です。「アプリが VSYNC 信号の途中でレンダリングを開始した場合」で始まる文は、特に DispSync について語っています。それを読んだら、うまくいけば、デバイスのグラフィック ドキュメントの DispSync セクションがより意味のあるものになります。
ほとんどのデバイスには DispSync オフセットが構成されていないため、実際には VSYNC 信号は 1 つだけです。以下では、DispSync が有効になっていると仮定しています。
ハードウェアは、プライマリ ディスプレイのリフレッシュに対応する 1 つの VSYNC 信号のみを提供します。その他は、SurfaceFlinger DispSync コードによってソフトウェアで生成され、実際の VSYNC からの固定オフセットで起動します。タイミングがずれないようにするために、いくつかの巧妙なソフトウェアが使用されます。
シグナルは、SurfaceFlinger の構成とアプリのレンダリングをトリガーするために使用されます。アーキテクチャ ドキュメントのセクションに従うと、アプリがコンテンツをレンダリングしてからコンテンツが画面に表示されるまでの間に 2 フレームのレイテンシが確立されることがわかります。VSYNC が 3 回発生すると、アプリは V0 で描画し、システムは V1 で構成を行い、構成されたフレームは V2 でディスプレイに送信されます。
タッチ入力を追跡しようとしている場合、おそらくユーザーの指の下でマップを動かしている場合、遅延はユーザーからは遅いタッチ応答として認識されます。目標は、レイテンシを最小限に抑えてユーザー エクスペリエンスを向上させることです。イベントを少し遅らせて、アプリが V0.5 で描画し、V1.2 で合成してから、V2 で表示に切り替えるとします。以下に示すように、アプリと SF アクティビティをオフセットすることで、合計レイテンシを 2 フレームから 1.5 に削減します。
それが DispSync の目的です。リンクしたページのフィードバック図では、HW_VSYNC_0 は物理ディスプレイのハードウェア リフレッシュ、VSYNC はアプリのレンダリング、SF_VSYNC は SurfaceFlinger による合成を引き起こします。それらを「VSYNC」と呼ぶのは少し誤称ですが、LCD パネルでは「VSYNC」と呼ぶのはおそらく誤称です。
フィードバック ループ図に示されている「リタイア フェンス タイムスタンプ」は、巧妙な最適化を示しています。実際のハードウェア VSYNC で作業を行っていないため、リフレッシュ信号をオフにすると、効率が少し向上します。DispSync コードは、代わりにリタイア フェンス (これはまったく別の議論です) からのタイムスタンプを使用して、同期が外れているかどうかを確認し、軌道に戻るまで一時的にハードウェア信号を再度有効にします。
編集: Nexus 5 boardconfigで値がどのように構成されているかを確認できます。VSYNC_EVENT_PHASE_OFFSET_NS
との設定に注意してくださいSF_VSYNC_EVENT_PHASE_OFFSET_NS
。