2017-02-02 23 views
0

イメージを一定の割合で表示するはずのモジュールを構築しています(あらかじめ定義されているわけではありませんが、 )。qt&openglのタイミング精度とvsyncの問題を表示する画像、C++

私の研究から、openGL呼び出し(SwapIntervalファミリ)でvsyncを有効にした後、QGLWidgetがこのタスクに適したツールであるという結論に達しました。

しかし、実際にスワッピング機構を実装する方法はわかりません。タイマーを使用する必要がありますか? 333.3 ms(3 Hz)のタイマーを設定した場合、リフレッシュレートが60 Hz(1サイクルあたり16.67、したがってタイマーは20サイクル)の場合、タイミングは問題ありませんか?そしてレートが9Hzでなければならない場合、私は得ることができる最高ですので、100 + 16.67のためのタイマーを設定する必要がありますか? そして、タイマーがOKなら、私はtimeoutイベントを送るときにpaintGL()を呼び出すべきですか?

おかげ

答えて

1

私はタイマーを使用する必要がありますか?

はい、ただし素朴な方法ではありません。画像のプレゼンテーションを正確に示すためにタイマーを使用する場合は、タイマー周波数はディスプレイのV-Sync/Refreshオシレータに対してbeatになります。プログラムタイマーはディスプレイ出力とは別のクロックソースから実行されます。

この叩打は、スワップ間隔が不足し、フレームの吃音として認識されます。

代わりに、以下を実行する必要があります。高精度時刻測定タイマーを開始するには、V-Syncedバッファースワップ(SwapBuffers¹)を参照ポイントとして使用します。

次に、あなたが目指す将来のプレゼンテーション時間のフレームをレンダリングします。 G-SyncまたはFreeSyncが使用されている場合を除き、フレームの間隔が表示の更新間隔単位で表示されることを考慮してください。 glFinishを使用してフレームレンダリングプロセスの完了を強制し、タイマーを停止し、フレームのレンダリングに要した時間を判断します。フレームがリフレッシュ期間よりも早く終了した場合は、目的の表示期間(期間の中心を目指して)にプログラムを遅らせる追加の(高解像度の遅延)、次に参照するSwapBuffersが続きます次の反復のポイント。


¹:これは、NvidiaおよびAMDカードとその独自のドライバでのみ確実に動作します。インテルGPUのドライバは、タイミングが異なります。

+0

ありがとうございますが、「V-Synced buffer swap」はどういう意味ですか?どのようにして測定を開始できますか?それが私が制御またはアクセスできるものですか?バッファスワップは暗黙のうちに呼び出され、私のものではありません。 – JLev

+1

@JLev:技術的にはQt-4の遺産であるQGLWidgetを使用しています.QOpenGLWindowを使用するQt-5では、少し複雑になりました。とにかく、QGLWidgetには、その名前が意味するものを正確に行うメンバ関数 'QGLWidget :: swapBuffers'があります。ただし、実際に同期させるには、V-Syncを有効にする必要があります。これはグラフィックスドライバの設定と実行時に要求される動作が '... swap_control'拡張(' swap_control'のためのhttp://opengl.org/registryの検索を参照)を使って細かく調整されている場合に強制/禁止することができます。 – datenwolf

+0

あなたの提案を実装しようとすると、私はv-syncを一貫させるのが難しいです。私はおそらく参照するためにswapbuffersを呼び出す場合、私は "QOpenGLContext :: swapBuffers()は非露出のウィンドウで呼び出され、動作は定義されていません。"空白をレンダリングして使用するだけですか? – JLev

関連する問題