メインスレッドとは異なるスレッドから QGLWidget に OpenGL をレンダリングする際に奇妙な問題があります。
別のスレッドからレンダリングを行うことは「完全に可能」であるという Qt 開発者からの公式声明が多数あります。私は次の説明に従いました:
http://doc.qt.nokia.com/qq/qq06-glimpsing.html#writingmultithreadedglapplications
ほぼ同じ方法で実装しました。唯一の違いは、異なる GLWidget で QWorkspace を使用せず、代わりに GLWidget を中央ウィジェットとして使用して MainWindow を作成することです。
アプリケーションを起動すると、レンダリング スレッドがランダムな位置にある三角形のフレームのレンダリングを開始します。しばらくすると (2 秒、場合によっては 10 秒)、スレッドは swapBuffers() 呼び出しで非常に長い時間ブロックし始めます。数秒後に swapBuffers() が自然に戻ることがあります。マウス ポインターをウィジェットまたはメイン ウィンドウの上に移動すると、swapBuffers はすぐに戻り、マウス ポインターを移動している限り、swapBuffers() はブロックされません。マウスをウィジェットの外に移動した後、またはマウスの移動を停止した後、レンダリングが数秒間続行され、swapBuffers が再びブロックを開始します。
この動作については、まったく説明がありません。フレームが完了するまで swapBuffers() が定期的にブロックされることを認識しており、vsync の待機も OpenGL バッファー スワップ呼び出し中に発生する可能性があることは明らかです。しかし、それは数ミリ秒で発生し、数秒間ブロックすることはありません。環境はX11 with GLXです。
wtfがここで起こっているという考えを持っている人はいますか? 問題が何であるかを見つける方法さえわかりません..
上記でリンクしたドキュメントで説明されているように、別のスレッドからレンダリングを実装しようとした人はいますか?