gtklexを使ってOpenGLを使用し、アニメーションを実行するとき、私は減速の問題を抱えています。バッファをスワップしている多くのOpenGL描画領域が遅くなる問題
私は、GTKアプリケーションでOpenGLを使用して特定の表示を行うアプリケーションを基本的に持っています。一度に多くのウィンドウを開くことができます(また、特定のウィンドウには複数の描画領域があります)。したがって、20-30のOpenGL描画領域を画面上に一度に言うことが可能です。図面はあまり重すぎるものではなく、非常に高速です。
私の問題は、これらのすべてのディスプレイがアニメーション化されているために、アプリケーションの速度が遅くなることです。私が問題を引き起こしているのは、OpenGLへのスワップバッファの呼び出しだと私は決定しました。 GTKで描画すると、ウィジェットのすべての描画がイベントを公開します。したがって、描画エリアウィジェットでgtk_widget_queue_drawを呼び出すと、GTKがそのイベントを処理しているときに、描画を必要とするすべてのウィジェットで連続してexposeイベントが呼び出されます。問題が生じるのは、描画が終了した後で、スワップバッファを呼び出して実際のOpenGLを描画する必要がある(ダブルバッファリングのため)。この呼び出しは、モニタが更新されるまで(vysncがオンであるため)ブロックされているようです。画面に3つの描画領域がある場合は問題ありませんが、トンがある場合は、スワップバッファコールが呼び出され、スワップバッファコールが呼び出されるたびにアプリケーションをブロックして実際にスローダウンします自身のイベントを公開し、いずれも同期していません。
私の質問は、スワップバッファの呼び出しをすべて同期する方法があるため、あまりブロックされていません。 vsyncをオフにする(OS/OpenGLの実装に固有の問題があるので、それ自体は問題だが)スピードの問題は解決されるが、問題が引き裂かれる。私はGTK公開イベントでswapbuffersを実行しなければならないので、マルチスレッドがどのように役立つかはわかりません。なぜなら、何か考えていない限り、図面はGTKと同期しているからです。
助けていただけたら幸いです!
各OpenGLウィンドウは1つの三角形だけを描画します。 SwapBuffersが呼び出されたスレッドをブロックするV-Syncが問題です。 – datenwolf