18

マルチスレッド アプリケーションを使用しており、さまざまなスレッドでレンダリングしようとしています。最初に、すべてのスレッド間で同じレンダリング コンテキストを使用しようとしましたが、他のスレッドの現在のコンテキストが NULL になっていました。インターネットで、1 つのコンテキストは一度に 1 つのスレッドでしか最新にできないことを読みました。

そこで、違うものを作ることにしました。ウィンドウを作成し、そこから HDC を取得し、最初の RC を作成します。その後、この HDC をスレッド間で共有し、新しいスレッドを作成するたびに、同じ HDC から新しい RC を取得し、そのスレッドの最新の RC にします。これを行うたびに、返される RC は常に異なります (通常は前の値 + 1)。wglGetCurrentContext()RC を返すかどうかを確認するアサーションを行いますが、作成されたばかりのものを返すようです。しかし、レンダリングを行った後、レンダリングが行われず、呼び出すGetLastError()とエラー 6 (無効なハンドル??) が発生します。

これは、 の新しい呼び出しが行われるたびに新しい値が返されるにもかかわらずwglCreateContext()、どういうわけか、これらすべての異なる値が OpenGL 呼び出しに対する同じ「接続チャネル」であることを意味するのでしょうか?

これは、スレッドで以前のレンダリング コンテキストを常に無効にし、新しいレンダリング コンテキストでアクティブにする必要があるということですか? 私は本当にこの同期を常に行う必要がありますか、またはこの問題を回避する他の方法はありますか?

4

5 に答える 5

56

マルチスレッド アプリケーションを使用しており、さまざまなスレッドでレンダリングしようとしています。

しないでください!!!

レンダラーをマルチスレッド化しようとしても、何も得られません。基本的に、1 つの大きな競合状態が発生しており、ドライバーはスレッドを同期して何らかの形でそれを理解するのに忙しいだけです。

最高のレンダリング パフォーマンスを得るには、すべての OpenGL 操作を 1 つのスレッドのみに保持します。すべての並列化は GPU 上で無料で行われます。

于 2012-06-19T08:46:23.337 に答える
14

OpenGL Consortiumの次の wiki 記事を読むことをお勧めします。

簡単に言えば、OpenGl に関するマルチスレッドの意味に大きく依存します。1 つのスレッドがレンダリング部分を実行し、1 つ (または複数) のスレッドが他のジョブ (つまり、AI、物理学、ゲームロジックなど) を実行している場合、それは完全に正しい。

複数のスレッドで OpenGL を台無しにしたい場合は、できません。できればできますが、実際には利点よりも多くの問題が発生します。

この概念についてより良いアイデアを得るために、OpenGL の並列使用に関する次の FAQ を読んでみてください。

http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

于 2012-06-19T09:59:52.833 に答える
1

Mac OS X 上の OpenGL はシングル スレッド セーフです。有効にするには:

#include <OpenGL/OpenGL.h>

CGLError err = 0;
CGLContextObj ctx = CGLGetCurrentContext();

// Enable the multi-threading
err =  CGLEnable( ctx, kCGLCEMPEngine);

if (err != kCGLNoError ) {
     // Multi-threaded execution is possibly not available
     // Insert your code to take appropriate action
}

参照: 並行性と OpenGL - Apple Developer

そして: テクニカル Q&A QA1612: OpenGL ES マルチスレッドと ...

于 2015-03-31T01:22:26.633 に答える
0

https://www.imaginationtech.com/blog/understanding-opengl-es-multi-thread-multi-window-rendering/

マルチスレッド レンダリングを使用してはいけない場合

CPU が制限されていないか、ロード時間が問題にならない場合。

したがって、CPU が制限されている場合は、他のスレッドを分離して、コーデック、テクスチャのアップロード、計算など、CPU が制限されたジョブを実行します...

于 2021-07-05T08:31:10.187 に答える