nDisplay での同期

複数のディスプレイ間で同期を行うする仕組みの概要を説明します。

Choose your operating system:

Windows

macOS

Linux

同期は、リアルタイム コンテンツを複数のセクションに分割して単一の大きなディスプレイに表示する上で欠かせない処理です。レンダリングまたはディスプレイ エコシステム内のすべてのシステムがミリ秒単位で測定される厳密なタイミングに従うことで、シームレスなディスプレイが表示されているように見せます。

マルチディスプレイ構成では、多くの場合、ソフトウェア レベルとハードウェア レベルの両方で同期機能が必要になります。生成されたコンテンツは、シミュレーションのための同一のタイミング情報を使用してすべての PC で同時に生成される必要があるだけでなく、ディスプレイ スワップ (ビデオ カード バッファ中での次の映像のための現在の映像の置換) を正しいタイミングで実行して、ディスプレイで「ティアリング」アーティファクトが発生しないようにする必要もあります。

VR をはじめとする立体ディスプレイでは、2 つのフレーム (片目ごとに 1 フレーム) が完全に一致する必要があるため、この同期の問題が二重に生じます。

決定論

同期を管理するには次の 2 通りの方法があります。

  • 決定的: 各サーバー (PC、レンダリング ノード) に特定の入力セットが指定され出力が常に予測可能になるように設定されます。つまり、サーバーがシステム内で他のマシンと同期する必要がある情報は正確な時間と、個々のマシンの入出力情報だけです。

  • 非決定的: システムは同期を確実に行うために、トランスフォーム行列とシーン内のすべてのアクタやオブジェクトのその他の関連特性を強制的にレプリケーションしてシステム全体を複製します。

どちらのアプローチにも長所と短所があります。決定的システムの主な長所は、プロジェクトのシンプルさと各フレームで各オブジェクトのトランスフォーム データを共有しないことによりデータ帯域幅が節約されることです。短所はシステムで拡散が生じると、時間の経過とともにその拡散を把握しきれないという問題が発生します。レンダリングの均一性が大幅に損なわれることで映像が断続的になったりアーティファクトが発生したりすることがあります。

ハードウェアの同期とゲンロック

どのフレームをレンダリングするかなどのゲームプレイの観点では nDisplay のマスター PC は、クラスタ内のすべてのスレーブ (ノード) PC にタイミング情報を通知しますが、専用のハードウェア同期カードと互換性のあるプロ用グラフィック カードは、物理的なディスプレイ デバイスでレンダリングされたフレームの表示をまったく同じタイミングで同期する必要があります。

例えば、ブロードキャスト アプリケーションでは、カメラ、モニタ、その他のディスプレイなど、多数のデバイスを厳密に同時に次のフレームに切り替えてキャプチャするために、これらすべてのデバイスを同期するのが一般的です。この業界では、ジェネレータロック信号 (genlock) が広く導入され、使用されています。

この構成は、通常、同期が必要なハードウェアにクロックを送信するハードウェア ジェネレータで構成されます。リアルタイム レンダリングに使用する PC の場合、NVIDIA Quadro シリーズのようなプロ向けのグラフィック カードのなかでも受信したタイミング信号またはパルスにロックする NVIDIA Quadro Sync II カードがこのテクノロジーをサポートしています。

システム トポロジー

Primary Node (house clock generator)

Cluster Nodes (receiving clock from primary node GPU)

Synchronisation Demystified を表示する

  • フレームロックのみ: GPU でデイジーチェーン技術を使用するこのメソッドは、NVIDIA では一般的に FrameLock/SwapSync と呼ばれています。ゲンロックは使用されていません。マスター nDisplay PC の GPU はマスター クロックを取得します。すべての PC が 3 つのトポロジー内で接続されます (マスター PC はルートです)。このアプローチにより、NVIDIA API 経由で NVIDIA スワップ グループ/バリアの使用が可能になります。

    このアプローチはバーチャル プロダクションにはあまり適していません。空間内で使用され、外部のマスター クロックと同期している他のすべてのデバイスとは分離して機能するからです。

  • ゲンロックのみ: このスキームを使うと、すべてのクラスタ PC の GPU が同じソースから独自のマスター クロック信号 (genlock) を取得します。言い換えると、各 PC は独自の BNC ケーブルを取得し、すべてのケーブルは同じマスター クロック ジェネレータに接続します。

    このアプローチにより、VSync の同期が可能になりますが、NVIDIA API を介した NVIDIA バリアは使用されません。技術的に、すべてのクラスタ PC は受信されるクロックにフレームロックされます。しかしながら、このアプローチではアプリケーション レベルでのフレーム提示に対する正確な制御がないため、100% 信頼できることが証明されていません。

    このメソッドを以前使用していたため、同期されない可能性 / グリッチの可能性を低くする「高度な」同期ポリシーを実装しなければなりませんでした。

  • ゲンロックとフレームロック:バーチャル プロダクションの最も好ましいアプローチです。 すべてのステージ デバイスはマスター nDisplay PC GPU などのマスター クロックに接続されます。クラスタ内同期は、マスター PC とレンダー ノード PC 間のデイジー チェーン接続を使って完了します。

    このアプローチでは NVIDIA API の使用が可能なため、NVIDIA バリアを使用し、アプリケーション レベル上でのフレーム提示に対して UE 制御を行うことができます。そのため、与えられた外部クロック (ゲンロック) と共に、ディスプレイを同期する上で最も信頼できる同期メソッドが提供されます。

デイジー チェーンとダイレクト ゲンロックの比較

デイジー チェーンは、ダイレクト ゲンロックと一緒に使用できる信号ロック技術です。デイジー チェーンでは、マスター クロックは単一の PC またはデバイスに送信され、個別のケーブルにより信号が他すべてのハードウェアに伝播されます。NDisplay に関するこれまでの経験から、各 PC がマスター ソースから直接クロックを受信するダイレクト ゲンロックはデイジー チェーンよりもシンプルで効果的であるものの、デイジー チェーンに基づく新しいハードウェア アプローチは、ダイレクト ゲンロック アプローチより信頼性と費用対効果の高い、信号ロック ソリューションにつながると考えられています。このソリューションは NVIDIA スワップ同期/ロックという名称です。

NVIDIA Mosaic と AMD EyeFinity

NVIDIA の Mosaic モード と AMD の EyeFinity は、1 枚のグラフィック カード内の複数の出力を結合して同期させることで、OS やソフトウェアの観点から独自のディスプレイとして表示されるようにできるよく似ている GPU 技術です。この仮想ディスプレイは、基本的には複数の物理ディスプレイの集合体であり、単一の同期ディスプレイとして機能します。また、基盤となるフレームロックまたはゲンロック技術を使用して、異なるシステムの他のディスプレイと同期することもできます。

ハウス クロックを使用して複数のディスプレイをロックするプロセスは、フレームロックといいます。ゲンロックは、ハウス クロックではなく、外部クロックを使用するプロセスです。ゲンロックでは、ディスプレイ デバイス、カメラ、トラッキング センサーを含むすべてのデバイス全体で外部クロックが使用されます。

Quadro Sync II カードまたは Firepro S400 カードを使って正確に接続すると仮定すると、Mosaic および EyeFinity 技術を使用して、1 枚のグラフィック カードの複数の出力で厳密に同一のクロックを共有し、オペレーティング システムの観点で単一の大型ディスプレイ キャンバスとして処理することができます。PC 全体ではなく PC ごとに好きな数だけ Mosaic グループまたは Eyefinity ブループを作成することができます。各 PC には独自の Mosaic または Eyefinity がなければなりません。

デイジー チェーン技術を使用して複数の PC や GPU で制御される複数のディスプレイを同期させるには、1 つの GPU がマスター クロック ジェネレータとして動作して、この GPU が、Nvidia Quadro Sync II や AMD Firepro S400 などの同期カードを使用する同一の PC または異なる PC 上で他の GPU とクロックを共有する必要があります。

詳細については、「 マルチディスプレイのための Mosaic テクノロジー - | NVIDIA 」および「 マルチディスプレイ Eyefinity テクノロジー 」を参照してください。

1 台の PC 内の複数に GPU に MOSAIC 仮想ディスプレイをスポーンすることも可能ですが、現時点ではキャンバス上にアプリケーション ウィンドウを出すことに手間取ります。(今後は有効になる可能性があります。)現時点でこのアプローチはバーチャル プロダクションやインカメラ VFX では推奨しません。

ディスプレイ同期のその他の特性

ゲーム スレッドとレンダリング スレッドは、スレッド バリアと呼ばれる機構によって常に同期されます。スレッド バリアは、以下の 2 つの項目の主要な機能です。バリアを無効にすることはできません。スレッド バリアは、マスター ノードが同期的にスレーブを処理することで、複数の UE PC 間で統一されたコンテンツ エクスペリエンスを提供するのに役立つタイムスケール上のポイントと考えることができます。

機能

説明

ソフトウェア/シミュレーション (表示する必要がある要素)

すべてのソフトウェア関連事項を同期するプロセス。Unreal Engine とそのコンテンツを適切に同期させることを目的としたプロセスで、機能決定論、デルタタイム同期、入力レプリケーション、カスタム トランスフォーム、スレッド バリア、クラスタ イベント、ゲーム ロジックなどがあります。

ハードウェア/OS (コンテンツを表示する方法)

1 つの共有クロック (ハウス同期またはゲンロック信号) を使用して、GPU、ディスプレイ デバイスなどのハードウェア デバイスと DWM (デスクトップ ウィンドウ マネージャー) を同期させるプロセス。オペレーティング システムとハードウェアに、ティアリングを発生させることなく、必要なものを同期して表示させる方法です。これには NVIDIA Quadro グラフィック カードと Sync II カード、そしてゲンロック ジェネレータが必要です。これが有効になっていない場合、1 フレーム以上のハードウェア遅延が生じることが予測されます。

同期ポリシー

ポリシー

説明

swap_sync_policy=0:

VSync=0 を意味します。すべてのノードが RenderThreadBarrier WITHOUT を VBlank に同期した後にフレームを表示します。これは、ティアリング アーティファクトが発生する可能性がありますが、最大の FPS を得ることができます。

swap_sync_policy=1:

VSync=1 を意味します。すべてのノードが、RenderThreadBarrier WITH を VBlank に同期した後にフレームを表示します。出力表示にティアリングは発生しません。ただし、DWM とランタイムまたはドライバの設定によっては、ディスプレイの間でティアリングが生じる場合があります。

swap_sync_policy=1 + advanced sync enabled:

ソフトウェア レベルでの実行を試行すること以外は、前のポリシーと同じです。

swap_sync_policy=2:

4.25 で追加されました。デイジー チェーン接続に基づく NVIDIA ハードウェア フレームロック ( Nvidia SwapLock API ) です。

コンフィグおよび cluster_node swapgroup パラメータの新しい同期ポリシー:

これまでのリリースで、特定の nDisplay PC 上でフレームのレンダリングが VBlank の後に行われ、スクリーンにティアリングが発生するような特定の状況を想定して Advanced Sync という同期メカニズムを開発しました。このソフトウェアの仕組みでは、当該イベントの予測を試み、すべての PC に次の VBlank でのスキップとレンダリングを強制的に実施します。このメカニズムは 100% 完璧ではなく、有効化されていると、パフォーマンスに望ましくない影響を及ぼす場合があります。

今回のリリースで、新たに提供される同期用の Nvidia API を実装することにしました。この API は、問題に対するハードウェア対応のアプローチです。

FrameLockConnectionsTimingServer.png

タイミング サーバーでのフレームロック接続:1) タイミング サーバー 2) クライアント

SyncSource.png

1) 同期ソース 2) サーバー 3) クライアント

同期させる

バーチャル プロダクションという状況で信頼できる同期をするために、ゲンロックとフレームロックの両方を組み合わせた技術を使用しなければなりません。まとめると、ゲンロック信号とマスター nDisplay PC に送信し、デイジーチェーン ハードウェア メソッドを使って入ってくる同期信号をすべての残りのクラスタ PC にディスパッチして、それらが適切にフレームロックされるようにします。これは、コンフィギュレーション ファイル内で適切に定義する必要のある同期 #2 ポリシーということになります。

ワークフロー

  1. 通常の RJ45 コネクタを備える通常の Ethernet ケーブルを使用して、クラスタの GPU 同期ボード間をデイジーチェーン接続します。

  2. MOSAIC を有効にして、NVIDIA のコントロール パネルで同期を設定します (マスターを設定してから、同期スレーブを設定)。

  3. nDisplay コンフィグ ファイルで、同期ポリシーを「 2」に設定します。[general] swap_sync_policy=2;

  4. オプション:複雑なシステムでは、新しい [nvidia] コンフィグ エンティティを使用して、nDisplay コンフィグ ファイルで NVIDIA スワップ グループと同期バリアをカスタマイズすることができます。例: [nvidia] sync_group=2 sync_barrier=2

デフォルトでは、sync group 1 と sync barrier 1 を使用します。

swap_sync_policy=2 コンフィグ設定では、複数のクラスタ ノードで NVIDIA スワップ グループを使用できます。

追加コメント

「0」という値を指定することはできません。「0」という値は、グループまたはバリアを解除/離脱するために内部で使用されます。自然数のみ使用可能です。1 つの GPU と 1 つの同期ボードを持つシンプルなシステムには、単一の同期グループ #1 と単一の同期バリア #1 があり、デフォルトではこれらを使用します。

同期テスト

次のいずれかの問題の結果として非同期が発生する場合があるため、拡張ディスプレイでの同期テストは困難になる場合があります。

  • 誤ったタイムスタンプにより間違ったフレームがシミュレートされる (ソフトウェアの問題)

  • ディスプレイ デバイスのタイミングがずれている (ディスプレイまたはハードウェアの問題)

同期をテストするために、Epic ではディスプレイ サーフェス全体を素早く移動する単一のオブジェクトを表示する単純なテスト プロジェクトを使用しています。システムが正しく同期されると、バリアを越えてオブジェクトが渡されてもそのフォームは保たれます。正しく同期されないと、ディスプレイの共有エッジでアーティファクトが発生します。

ScreenOneScreenTwo.png

システムが正しく同期されている場合、スクリーン 1 から スクリーン 2 にオブジェクトが渡されてもそのフォームは保たれます。

追加情報へのリンク

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる