web-dev-qa-db-ja.com

Android VSYNCシグナルの必要性を理解する

Androidディスプレイサブシステムをよりよく理解しようとしていますが、それでも私を混乱させる1つの項目は、VSYNC信号の処理方法と、その理由です。そもそも非常に多くの存在があります。

Androidは、コアでVSYNCを使用するように設計されていますが、複数のVSYNCシグナルを使用しています。経由 https://source.Android .com/devices/graphics /implement.html 「VSYNCオフセット」セクションには、3つのVSYNC信号:HW_VSYNC_0、VSYNC、およびSF-VSYNC)を示すフロー図があります。 HW_VSYNCがDispSyncのタイミングを更新するために使用され、VSYNCとSF-VSYNCがアプリとsurfaceflingerによって使用されることを理解していますが、なぜこれらの個別の信号がまったく必要なのですか?さらに、どのようにオフセットはこれらの信号に影響を与えますか?これをよりよく説明するタイミング図はどこにでもありますか?

あなたが提供できるどんな助けにも感謝します。

15
Shookit

このことを理解するには、 システムレベルのグラフィックアーキテクチャ ドキュメントから始めるのが最善です。特にトリプルバッファリングの必要性セクションと関連する図(理想的にはアニメーションGIFになります)。 「アプリがVSYNC信号の中間」でレンダリングを開始した場合」で始まる文は、特にDispSyncについて話します。それを読んだら、デバイスグラフィックドキュメントのDispSyncセクションの方が理にかなっていることを願っています。 。

ほとんどのデバイスにはDispSyncオフセットが構成されていないため、実際には1つのVSYNC信号のみです。以下では、DispSyncが有効になっていると仮定します。

ハードウェアは、プライマリディスプレイの更新に対応する1つのVSYNC信号のみを提供します。その他は、SurfaceFlinger DispSyncコードによってソフトウェアで生成され、実際のVSYNCからの固定オフセットで起動します。いくつかの巧妙なソフトウェアが使用されます。タイミングがずれないようにします。

信号は、SurfaceFlingerの構成とアプリのレンダリングをトリガーするために使用されます。アーキテクチャドキュメントのセクションに従うと、アプリがコンテンツをレンダリングしてからコンテンツが画面に表示されるまでの間に2フレームのレイテンシが確立されることがわかります。次のように考えてください。VSYNCが3回発生すると、アプリはV0で描画し、システムはV1で合成を行い、合成されたフレームはV2でディスプレイに送信されます。

タッチ入力を追跡しようとしている場合、おそらくユーザーの指の下で地図を動かそうとしている場合、待ち時間はユーザーには遅いタッチ応答として表示されます。目標は、待ち時間を最小限に抑えてユーザーエクスペリエンスを向上させることです。イベントをわずかに遅らせたため、アプリはV0.5で描画し、V1.2で合成してから、V2でディスプレイに切り替えたとします。以下に示すように、アプリとSFアクティビティをオフセットすることで、合計レイテンシを2フレームから1.5に短縮します。

enter image description here

それがDispSyncの目的です。リンクしたページのフィードバック図では、HW_VSYNC_0は物理ディスプレイのハードウェア更新であり、VSYNCはアプリをレンダリングし、SF_VSYNCはSurfaceFlingerに合成を実行させます。これらを「VSYNC」と呼びます。 「」は少し誤称ですが、LCDパネルでは、「VSYNC」と呼ばれるものはおそらく誤称です。

フィードバックループ図に記載されている「リタイアフェンスのタイムスタンプ」は、巧妙な最適化を示しています。実際のハードウェアVSYNCで作業を行っていないため、リフレッシュ信号をオフにすると、効率が少し向上します。 DispSyncコードは、代わりにリタイアフェンスからのタイムスタンプ(これはまったく別の議論です)を使用して、同期が外れていないかどうかを確認し、ハードウェア信号が軌道に戻るまで一時的に再度有効にします。

編集:Nexus 5 boardconfig で値がどのように構成されているかを確認できます。 VSYNC_EVENT_PHASE_OFFSET_NSSF_VSYNC_EVENT_PHASE_OFFSET_NSの設定に注意してください。

24
fadden