9

Windowsアプリケーションで、複数のOpenGLウィンドウを同時に開いています。理想的には、これらのそれぞれを60 fpsで描画し、画面の更新に同期させたいと思います。

レンダリングコンテキストごとwglSwapIntervalEXT(1)に、vsyncをオンにするように呼び出しています。各ウィンドウには独自の表示スレッドがあり、フレームを描画してSwapBuffersから更新を呼び出します。

ウィンドウが互いに「競合」していることがわかります。SwapBuffers呼び出しは同期されており、別々のスレッドにある場合でも、互いに待機しているように見えます。各ウィンドウのフレーム間時間を測定しています。ウィンドウが2つある場合、これは30 fpsに低下し、3〜20fpsな​​どになります。

でvsyncをオフにするとwglSwapIntervalEXT(0)、開いているウィンドウの数に関係なく、60fpsで正常に更新されます。ただし、1つのウィンドウを開いている場合、これはvsyncをオンにした場合ほどスムーズではありません。

OpenGLで私が望むことを達成する方法はありますか?

4

2 に答える 2

1

Linux では、さまざまなスレッドからビデオ関数を呼び出すため、アプリケーションに多くの奇妙な動作が発生しました。

アプリケーション起動時からの表示、ウィンドウ作成、glcontext 作成などを 1 つのスレッドで行い、このスレッドと他のスレッドとの間でデータを共有するためにセマフォとキューを使用することで、これらの問題を解決しました。

于 2016-10-12T16:52:28.367 に答える
0

出力デバイスを取得し、スレッドからのループでWaitForVBlank関数を使用できる場合があります。次に、関心のある各ウィンドウにメッセージを投稿したり、イベントを通知したりできます。

于 2012-05-06T17:38:46.343 に答える