2012-03-26 9 views
4

私のアプリケーションは、ダブルバッファリングとvblankへの同期を有​​効にして、高速レンダリングを行います(通常1フレームあたり1〜6ミリ秒)。私のメインループでは、約10ミリ秒寝てから、リアルタイム入力を少し読んで、できるだけ遅くレンダリングしながら、デッドライン前にフレームを更新しながら管理しています(60 FPSのレンダリングは最小のレイテンシで行います)。OpenGL垂直リトレースタイミングを見つける

私はバッファを交換した後にglFinishを使うことができますが、残念なことに、いくつかのシステムでは(少なくともLinuxでは合成されていません)、次のバッファスワップまで待たずに画像がHDMIポート25 msの範囲で待機し、30 FPSで動作するアプリケーション)。他のシステム(Linux合成)では、このアプローチがうまくいきます。 glFinishがなければ、より多くの作業がバッファされ、待ち時間が長くなります。

より正確なフレームタイミングを得るにはどのようなオプションがありますか?主なプラットフォームはWindows、Linux、OS Xです。

+1

垂直同期を有効にしたフレームのタイミングは意味がありません。 – Thomas

+0

これは同期機能を有効にしても動作しますが、信頼できる方法があれば(もちろん、裂けることはありません)、それがなければ、喜んでできます。 – Tronic

+0

OS Xでは、['CGDisplayModeGetRefreshRate'](http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html)を使用することができます。 – user1118321

答えて

2

私は約10ミリ秒スリープ状態にしてから、リアルタイム入力を読み込み、できるだけ遅くレンダリングしますが、締め切り前にフレームを更新する(最小レイテンシで60 FPSのレンダリングが可能)。

これは非常に信頼性の低いアプローチです。私はすべてのレンダリング操作を独自のスレッドに入れて、スワップが起こるまでバッファースワップをブロックすることをお勧めします。すべての入力データを集計する別のスレッドですべての入力処理を行います。スワップを実行する前に、処理スレッド上でミューテックスまたはセマフォを持ち上げる必要があります。これは、バッファスワップ時に発生します。

V-Syncのすぐ近くでutilをレンダリングするのを延期すべきではないことに注意してください。その代わりに、あなたがあなたのものをレンダリングするために持っている時間は、垂直帰線区間の始めに75%と仮定し、残りの25%は緊急マージンとして保持する必要があります。また、コンポジットを実行している場合、これにはGPUの時間も少し必要です。

あなたが早くまたは遅くレンダリングすると、視覚的結果に違いはありません。シミュレーションのタイミングが気になる場合は、実際に締め切りにして、V-Syncの時の状態のシミュレーションをレンダリングすると仮定します。シミュレーションのデータ入力にはKalman filterを使用して、予測に基づいてレンダリングし、新しい入力を「単に」調整します。

私はバッファを交換した後、glFinishを使用することができますが、残念ながらいくつかのシステム(Linuxの非合成、少なくとも)で、これは次のバッファスワップまでが、画像は、HDMIポートから送信されるまでだけではなく、待機するように見えます(合計待機時間は25ms、アプリケーションは30FPS)。

これは、タイミングがV-Syncを逃した場合に発生します.SwapBuffersは完全な垂直帰線期間を待機します。 IMHO SwapBuffersにはある種のタイムアウトパラメータを追加する必要がありますが、これまでのところはありません。

+0

非常に良い答え。追加するべきことの1つ:glFinishは本当に無意味です。これにアプローチする正しい方法は、実際にdatenwolfが言ったように:可能な限り高速にレンダリングし、GPUと出力をブラックボックスとみなします。それを時計として使用しようとしないでください。レンダリングは、あなたのコントロールから外れている多くのバッファによって遅延されるかもしれません。参照してください:http://superuser.com/questions/419070/transatlantic-ping-faster-than-sending-a-pixel-to-the-screen正確な時計を取得するのは難しいです。それはグラフィックスディスプレイを使用してそれはマゾヒズムです:) – starmole

関連する問題