C++11 スレッドを試す開発を行っています。非同期スレッドでいくつかのコードを実行したいのですが、そのコードが完了したら、メイン スレッドで他のコードを実行したいと考えています。
これは、非同期で実行したいのは OpenGL のものをロードしているためであり、スレッドを実行するときに OpenGL コンテキストを使用するのは少し難しいためです。私が知る限り、異なるスレッドで同じコンテキストを実行しないでください。
ただし、collada ファイルをロードするローダー スレッドを作成したいと思います。ここで実際に時間のかかる作業は、ファイルを解析してデータをセットアップすることであり、(技術的に) 別のスレッドで実行できるすべてのことを行います。メイン スレッドでの opengl 固有のタスク。(これは私の最初の考えであり、間違った方法で進んでいる可能性があります)..
したがって、1 つのスレッド非同期をデタッチして collada ファイルをロードし、データを入力することができれば、それが完了したら、メイン スレッドで呼び出してバッファーをバインドし、シェーダーをセットアップするなどを行うことを考えています。私はスレッドなしでそれを行うことができますが、GL がおかしくなることなく、バックグラウンドで新しいデータをロードするのはかなりスムーズです..
そこで、やりたい手順を並べてみます。
- メインスレッドは、それが行うことを実行します...
- 誰かが新しいメッシュをロードするように要求します
- 非同期スレッドを作成し、その中に collada データをロードすることによって初期化されたメッシュ
- その間、メインスレッドはそれを実行し続けます
- collada の読み込みが完了すると、非同期スレッドは、メイン スレッドで追加の読み込み (つまり、セットアップ バッファーなど) を行うことをメイン スレッドに通知します。
- 設定が完了し、メッシュがレンダー キューに追加されます
私はそれをすべて同期的に動作させています。私が望むのは、切り離された非同期スレッドが終了したら、いくつかのことを行う方法です。
ここでの私の考えに対する任意のアイデアまたはもちろん建設的な批判:P は温かく歓迎されます! 私はそれについてすべて間違った方法で考えているかもしれません.オブザーバーパターンのようなことを考えていましたが、最善の方法でそれに取り組む方法が本当にわかりません. OpenGL のものをスレッド化してもかまいませんが、トラブルを求めているように思えます..