VSync が有効になっている場合でも、ノンブロッキング SwapBuffers() を作成するポータブルな方法を探しています。
つまり、イベントで通知したり、次の VSync までの遅延を知ることは可能ですか?
2 に答える
IIRC この拡張機能は役に立ちます: http://www.opengl.org/registry/specs/SGI/video_sync.txtですが、現在のドライバーではサポートが不十分です。
まず、フレームの先頭でSwapBuffers()を呼び出してみませんか?または、どういうわけかパイプラインをに変更します
Render();
Update(); //Update before swapping buffers
SwapBuffers();
OpenGLは、投げたばかりのすべてのコマンドを処理している間、すべての更新ロジックを実行できます。
それ以外の場合、この問題を解決する方法がいくつかあります。
XNAにはScanLineプロパティがあり、画面が現在どのスキャンラインに対応しているかを示します。OpenGLがこれも公開するかどうかはわかりませんが、公開する必要があると確信しています。(右?)
マルチスレッドレンダリングを使用します。最近のエンジンの多くは、レンダリング専用にスレッド全体を使用しています。ブロックしても大丈夫、メインスレッドを邪魔しません。あるいは、新しいスレッドで入力などを処理する方が簡単な方法です。これにより、グラフィックスコンテキストの複雑さが回避されます。
トリプルバッファリングを使用します。トリプルバッファリングを使用するということは、2つのバックバッファがあることを意味します。SwapBuffersを呼び出すと、画面は引き続きフロントバッファーをスキャンし、新しく終了したバッファーを待機し、次のフレームをレンダリングするための3番目のバッファーをスキャンします。もちろん、すでに2つのフレームを事前レンダリングしている場合、SwapBuffers()はブロックします。