1

メインループをメインスレッドに保ちながら、計算をセカンダリスレッドに入れたいです。

たとえば、テクスチャを変更して OY の周りを回転する立方体が必要です。キューブの回転は、カメラを回転させるアイドル機能によってサポートされています。しかし、テクスチャの計算が複雑すぎて時間がかかるため、単純にアイドル状態にすることはできません (キューブが回転するたびにテクスチャを変更する必要はありません)。いくつかの計算処理を行い、テクセル バッファを作成し、別のスレッドで立方体の新しいテクスチャを設定するfoo関数を使用できますか? main関数のこのコードは、回転するキューブのテクスチャを変更しません。

glutIdleFunc(idle);
boost::thread_group tgroup;
tgroup.create_thread(boost::bind(&foo));
glutMainLoop();
tgroup.join_all();

また、別のスレッドで新しいテクスチャを設定すると、同時実行の問題がありますか?

4

3 に答える 3

3

一般的に言えば、複数のスレッドから OpenGL 関数を呼び出すことはできません (複数のレンダー コンテキストまたはコンテキストの切り替えを使用しない場合)。

OpenGL コマンドを発行するには、バインドされたレンダー コンテキストが必要です。ウィンドウ システムは、スレッドごとに 1 つのコンテキストに制限します。これを回避するには、GLUT よりも高度なフレームワークを使用する必要があります。基本的な考え方は、コンテキスト間でリソースを共有する必要があるということです。1 つはデータをアップロードするためのもので、もう 1 つは実際にレンダリングするためのものです。

しかし、私がこれについて考えれば考えるほど、あなたがこれを行う本当の理由はありません. すべての GL コマンドに対して単一のスレッドを使用することに固執し、別のスレッドでディスクから画像ファイルをロードすることもできます。そして、レンダリングを実行するスレッドにシグナルを送り、 を使用してデータを GL に送信しますglTexImage2D (...)。正直なところ、あなたのユースケースは、マルチスレッドレンダリングを保証するほど複雑ではありません。

于 2013-09-13T01:05:00.787 に答える