リフレクションプローブのパフォーマンスと最適化
Unity のクラスターの展開

クラスターレンダリング

概要

Unity のクラスターレンダリングテクノロジーを使うと、同時に動く同じシーンを複数の端末でシミュレーションし、その結果を複数の画面に表示することができます。この機能を使えば、Unity 環境を video wallCAVEDome、その他の複数ディスプレイのカスタムレイアウトのような複雑なマルチスクリーン環境に展開することができます。

複数のディスプレイ出力をするのに 1台の端末しか使用しない他の方法に比べ、Unity のクラスターレンダリングにはディスプレイの数を大幅にスケールアップする能力があります (ネットワークの容量が高い場合は、50以上まで)。1台の端末で複数のディスプレイを動かすと、各ディスプレイがその端末の負荷となります。そのため、能力の高い端末でさえ、良好なフレームレートを提供するにはディスプレイ数を最小限に留めなければなりません。対照的に、Unity のクラスターレンダリングを使用すると、レンダリング負荷が多くの端末で分割されるため、各端末はディスプレイ 1つのレンダリングを担当します。

これを行うには、同じプロジェクトをすべての端末にインストールし、ロックステップ式同期を行います。各端末は同じシミュレーションを実行しますが、全体のマルチディスプレイ設定のうち各担当部分のみをレンダリングしているため、レンダリング出力のみ異なります。

このロックステップ式同期はローカルエリアネットワークで行われます。

ハードウェアの設定

クラスターのノードはワークステーションとディスプレイで構成されています。各ワークステーションは、クラスターレンダリングを使用可能な Unity アプリケーションのコピーを実行します。1つのマスターノードと複数のクライアントノードがあり、複数のクライアントノードはローカルエリアネットワークを通してマスターノードに接続します。この接続には、有線ネットワークの使用を強く推奨しています。WiFi ネットワークは一般的にあまり高速でなく、同期において安定性を欠く結果になるからです。

Unity のクラスターの裏側

クラスターレンダリンググループをスタートするには、マスター端末とすべてのクライアント端末を同時にスタートします。それから、マスターとクライアントの関係を定義する特定のコマンドライン引数を用いて、各端末でアプリケーションを開始します。

マスターノードはすべてのクライアントノードと同期します。この同期方法は「フレームロッキング」、または「ロックステップ」同期と呼ばれています。すべてのクライアントがいったんマスターと「チェックイン」すると、マスターノードは Update() ですべてのクライアントノードに「アップデート」信号を送ります。マスターノードはアップデート信号を送ると、次に全クライアントがチェックインしてそのサイクルを繰り返すのを待ちます。

マスターノードは、タイミング、乱数シード値、入力値などのデータも送ります。こうすることにより、マスターと全クライアント間で、確実にアプリケーションの同一シミュレーションを実行します。各フレームのマスターとクライアント間で同期されたデータペイロードは、シーンのオブジェクトの数や複雑さにかかわらず一定です。つまり、シーンの複雑さはネットワークパフォーマンスに影響せず、各ノードの個々のレンダリングパフォーマンスのみが影響します。

複数端末でのディスプレイの分割

クラスターでマスターに同期しているすべてのクライアントノードを整理して、それぞれ、分担する表示部分をレンダーするようにします。同期データにはカメラに関する情報がないので、カメラを各ノード個別に操作することができます。全ノードが同じシーンをシミュレーションしているので、カメラプロパティーを操作することが、各ノードに全体のディスプレイの正しい部分をレンダリングさせる秘訣です。

実行方法は、複数ディスプレイが物理的にどのように設定されているかによります。ただし、基本的アプローチでは、異なる射影行列を各ノードのカメラに割り当てます。詳細は、Camera.projectionMatrix を参照してください。

リフレクションプローブのパフォーマンスと最適化
Unity のクラスターの展開