2

QGLWidget の paintGL() メソッドを使用して、OpenGL を使用してウィジェットに描画するとします。Qt が paintGL() メソッドを呼び出した後、自動的にバッファー スワップがトリガーされます。通常、OpenGL では、バックグラウンド バッファーへのフレームのレンダリングが完了するまで、このバッファー スワップによって呼び出し元のスレッドがブロックされますよね? どの Qt スレッドが paintGL とバッファ スワップを呼び出すのだろうか。それはメインの Qt UI スレッドですか? もしそうなら、それはバッファスワップ中のブロックがUI全体もブロックすることを意味しませんか? このプロセスに関する一般的な情報は見つかりませんでした..

ありがとう

4

2 に答える 2

2

QGLWidgetを頻繁に使用することはありませんが、swapBuffers()が同期している場合、QtGUIスレッドがスタックしていると考えてください。これは、その操作中はイベントを処理できないことを意味します。

とにかく、これを実行しているときに問題が発生した場合は、マルチスレッドOpenGLがこの問題を克服できるようにするこの記事を読むことを検討してください。

さらに良いことに、この記事では状況を詳しく説明し、現在リリース候補となっているQt4.8の新しいマルチスレッドOpenGL機能を紹介します。

于 2011-10-16T09:40:47.380 に答える
0

通常、OpenGL では、バックグラウンド バッファーへのフレームのレンダリングが完了するまで、このバッファー スワップによって呼び出し元のスレッドがブロックされますよね?

実装方法によって異なります。これは、ハードウェアごと、およびドライバーごとに異なることを意味します。

もしそうなら、それはバッファスワップ中のブロックがUI全体もブロックすることを意味しませんか?

ブロックしても1/60秒しかブロックしません。ゲームの速度が低下している場合は、おそらく 1/30 です。本当に遅い場合は、1/15 です。ユーザーが行う最大 1 つのキー操作またはマウス操作は、メッセージ キューに残ります。

ブロックの問題は、UI に関するものではありません。ユーザーが気付かないほどの反応を示します。ただし、タイミングが厳しい場合 (ゲームの場合など) は、paintGLまったく避けることをお勧めします。Qtが指示したときではなく、必要なときにレンダリングする必要があります。

于 2011-10-15T20:39:20.233 に答える