並列化を使用して、階層的に順序付けられたオブジェクトを使用して3Dシーンを描画するためのリフレッシュレートを改善しようとしています。シーン描画アルゴリズムは、最初にオブジェクトのツリーを再帰的にトラバースし、そこから、シーンを描画するために必要な重要なデータの順序付けられた配列を構築します。次に、その配列を複数回トラバースしてオブジェクト/オーバーレイなどを描画します。私が読んだことから、OpenGLはスレッドセーフなAPIではないため、配列トラバーサル/描画コードはメインスレッドで実行する必要があると思いますが、配列を満たす再帰関数を並列化できるかもしれないと思っています。重要な点は、シーン内でオブジェクトが発生する順序で配列にデータを入力する必要があるため、特定のオブジェクトを配列インデックスに関連付けるすべての機能を適切な順序で実行する必要があることです。ただし、配列インデックスが割り当てられると、ワーカースレッドを使用して、その配列要素のデータを入力できます(これは必ずしも簡単な操作ではありません)。これが私が取得しようとしている擬似コードです。xml風のスレッド構文を理解していただければ幸いです。
recursivepopulatearray(theobject)
{
<main thread>
for each child of theobject
{
assign array index
<child thread(s)>
populate array element for child object
</child thread(s)>
recursivepopulatearray(childobject)
}
</main thread>
}
それで、OpenMPを使用してこれを行うことは可能ですか?もしそうなら、どのように?これをより適切に処理する他の並列化ライブラリはありますか?
補遺:ダビデのさらなる説明の要請に応えて、もう少し詳しく説明させてください。シーンが次のように順序付けられているとしましょう。
-Bicycle Frame
- Handle Bars
- Front Wheel
- Back Wheel
-Car Frame
- Front Left Wheel
- Front Right Wheel
- Back Left Wheel
- Back Right Wheel
現在、これらの各オブジェクトには、場所、回転、サイズ、さまざまな描画パラメータなど、多くのデータが関連付けられています。さらに、適切に描画するには、このシーンを複数回パスする必要があります。1つのパスはオブジェクトの形状を描画し、別のパスはオブジェクトを説明するテキストを描画し、別のパスはオブジェクト間の接続/関連付けを描画します(存在する場合)。とにかく、これらの異なるオブジェクトからすべての描画データを取得するのは、複数回アクセスする必要がある場合はかなり遅いので、1つのパスを使用して、すべてのデータを1次元配列にキャッシュし、次にすべての実際のオブジェクトをキャッシュすることにしました。描画パスは、配列を見るだけです。問題は、OpenGLのプッシュ/ポップを正しい順序で実行する必要があるため、配列はツリー階層を表す適切な深さ優先探索順序である必要があるということです。上記の例では、
index 0: Bicycle Frame
index 1: Handle Bars
index 2: Front Wheel
index 3: Back Wheel
index 4: Car Frame
index 5: Front Left Wheel
index 6: Front Right Wheel
index 7: Back Left Wheel
index 8: Back Right Wheel
したがって、配列の順序は適切にシリアル化する必要がありますが、その順序を適切に割り当てると、配列の入力を並列化できます。たとえば、自転車フレームをインデックス0に割り当て、ハンドルバーをインデックス1に割り当てると、1つのスレッドが自転車フレームの配列要素の入力を取得し、別のスレッドがハンドルバーの配列要素の入力を取得できます。
OK、これを明確にすることで、私は自分の質問に答えたと思うので、Davideに感謝します。だから私は自分の答えを投稿しました。