0

具体的には、2つのスレッドがあります。

最初の1つ:

ev_wait_vsync = CreateEvent(NULL, FALSE, FALSE, "wait_vsync");
...
printf("paint\n");
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
SetEvent(ev_wait_vsync);

そして、最初のものによって作成された2番目のもの:

WaitForSingleObject(ev_wait_vsync, INFINITE);
printf("start vsync\n");
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, UINT64_MAX);
printf("end sync\n");

これにより、セグメンテーション違反が発生します。出力は次のとおりです。

paint
start vsync

問題はにありglClientWaitSyncますが、なぜですか?

4

1 に答える 1

1

問題は glClientWaitSync にありますが、なぜですか?

OpenGL コンテキストは、一度に 1 つのスレッドでしかアクティブにできないためです。マルチスレッドの OpenGL 操作はデリケートなものであり、可能な限り避けるべきです。

あなたの場合、それglClientWaitSyncは経由で取得する必要があり、この関数が生成する関数ポインターは、関数ポインターが取得されたときにアクティブだったコンテキストとスレッドwglGetProcAddressでのみ有効です(これは OpenGL ではなく WGL の警告です)。他のコンテキスト、他のスレッド、および新しい/異なる関数ポインターを取得する必要があります。また、OpenGL 同期オブジェクトは、作成元のコンテキストでのみ機能します。

余談ですが、V-Sync とGL_SYNC_FLUSH_COMMANDS_BITは関係ありません。glReadPixelsaまたは aが出現したときにも発生する可能性glCopyTexImage2Dがあり、暗黙のフラッシュが発生します。

于 2012-09-17T11:05:35.870 に答える