3

同じメイン スレッドで 3 つの異なる QGLWidgets を使用しています。できれば 60fps でレンダリングしますが、20fps を超えることはできません。これは、各ウィジェットがおそらく独立してリフレッシュ レートと同期しようとするため、Vsync が原因であると思われるため、何らかの形でロックされます。ウィジェットを 2 つだけ使用すると、30fps に達します。または、1 つのウィジェットの更新レートを 10 fps に固定すると、他のウィジェットでは 25 fps に達します (10+25+25=60)。swapInterval()で設定した値に関係なく、常に 0 を返しますsetSwapInterval(int)。何か案は?Vsync を無効にできますか? それとも、別の原因で問題が発生している可能性がありますか?

4

2 に答える 2

3

現在、Qt 5.0 のバグのようです - https://bugreports.qt.io/browse/QTBUG-29073

Vsync をオフにすると、更新レートを QGLWidget 間で分割するという問題が解決されます。グラフィック カードは、指定した速度または可能な限り高速に画面にレンダリングされます。ただし、グラフィック カードの設定で VSync を無効にする必要があります。fmt.setSwapInterval(0) を設定するだけでは何も起こりません。

残念ながら、別の問題が発生します。水平方向の動きを含むビデオをペイントしている場合、テアリングが発生します。

Qt 5.3 でこのバグが修正されることを願っています。

于 2014-05-20T06:38:37.227 に答える
2

まだこの問題に苦しんでいる人のために、私の短い答えは次のとおりです。他のことを試す前に、Qt 5.4 をインストールしてください。

より長い答え:

Qt 4.8 で VSync を無効にする問題はありませんでした。

Qt 5.3.1 (Kubuntu 14.04 64 ビット) を使用して、QGLWidget を強制的に VBlank で同期しないようにすることはできませんでした。つまり、swapBuffers() は何があってもブロックされていました。「デスクトップ効果」パネルと NVidia コントロール パネルの両方で VSync を無効にし、setSwapInterval(0) を無効にしました。したがって、私の fps は常に 60fps/numOfQGLWidget に固定されていました (SingleBuffering を使用した場合を除きますが、私のアプリケーションではちらつきが許容されませんでした)。マルチスレッドを使用すると、理論的には VSync を有効にして (したがってティアリングなし)、複数の QGLWidget で 60fps を達成できるはずですが、それも機能しませんでした。

今日、Qt 5.4 をインストールしたところ、問題が魔法のように解決されました。Qt 4.8 で使用していたように、ノンブロッキング swapBuffers() を正常に取得できます。ドライバーの設定に関係なく、Qt 5.3 は何らかの形で VSync を強制したと思います。しかし、少なくとも私の構成では、Qt 5.4 ではそうではありません。Qt チームは Qt 5.4 の OpenGL を改善するために多くの作業を行ったようです (特に、彼らは QOpenGLWidget クラスを導入しました)。そのため、Qt で OpenGL を使用している人への私のアドバイスは、Qt 5.4 にアップデートすることです。人生をより簡単に。

于 2014-12-30T20:13:27.127 に答える