This is the documentation for Enlighten.
7.1.1.3. 実行時に複数のシステムがある場合
概要
低レベル ランタイムのウォークスルーのコード例は、単一のシステムを持つシーンを前提としています。シーンに複数のシステムがある場合、ライトはシステム間を行き来するため、状況はより複雑になります。
複数の入力ライティング バッファからの読み取り
システム間のライトの行き来を考慮に入れるため、関連するすべての入力ライティング バッファはソルバー関数 (SolveIrradianceTask など) の各インスタンスに渡されます。
内部では、各システムはプリコンピュートされたデータを介して他のどのシステムから読み取るかを把握しており、システム GUID を使用して入力を組み合わせます。これは以下の 2 つのステージによるプロセスです。
- まず、ヘルパー関数 Enlighten::PrepareInputLightingList を呼び出し、入力ライティング バッファのソートされていないリストから、適切な順序でリストを作成する必要があります。
- 次に、このリストはタスク構造を介してソルバー関数に渡されます。このリストは、いくつかのフレーム/解決で使用するためにキャッシュすることができることに注意してください。Enlighten::PrepareInputLightingList に渡される入力ライティング バッファが多すぎても問題ありません。読み取る必要がないものはそのまま無視されます。また、関数はシステムが不足していても成功します。ただし、足りないシステムからはライトが出ず、異常な結果になる可能性があります。SolveIrradianceTask は、出力を計算しようとしているシステムの入力バッファがない場合にのみ失敗してエラーになります。
複数のシステムの更新
ラジオシティ タスクを実行する前に、必要なすべての入力ライティングが生成されたことを確認する必要があります。
つまり、複数のシステムの更新を行う疑似コードは以下のようになります。
- すべてのシステムでループします
- 各システムの入力ライティングを更新します(入力ライティングの提供をご覧ください)。
- すべてのシステムで 2 度目のループをします
- 各システムに対して SolveIrradianceTask を実行します (イラディアンスの解決をご覧ください)。
- 必要な分のプローブ タスクを解決します (プローブ ポイントのための解決をご覧ください)。これらは、SolveIrradianceTask と並行して実行できます。
これらの 3 つのループは個々に並列処理できますが、ソルバーはすべてのシステムから入力ライティングを読み取るため、他のループの開始前に最初のループを完了する必要があります。
マルチスレッド
少し注意が必要ですが、Enlighten ランタイムは並行処理することができます。解決関数による読み取り中は、システムの入力ライティングを更新しないことが重要です。これを実現する最も簡単な方法は、上の疑似コードのように、入力ライティングの更新を解決の更新と完全に分けることです。
GeoRadiosity はマルチスレッドの PC ランタイムを有しています。Enlighten は、Intel Threaded Building Blocks を使用していくつかのシステムの入力ライティングを並行して実行します。その後、いくつかのシステムのラジオシティ解決を並行して実行します。すべてのスレッドがビジー状態であっても、パフォーマンスはプロセッサーの数に応じて大幅に向上します。システム数が作業の単位を決めるため、システムがすべてほぼ同じサイズである場合 (同時に利用可能なすべてのスレッドを使用する十分な数のシステムがある場合) に最大のパフォーマンスが発揮できます 。