16

画面上の刺激の提示時間の測定に最大の精度が必要なアプリケーションを更新しています。これは現在、かなり前に放牧された DirectDraw で作成されており、グラフィック ライブラリを更新する必要があります。

プレゼンテーション時間を測定する方法は、垂直ブランク期間の終了を検出することを利用しています。具体的には、プライマリ サーフェスにフリップされたもの (またはスワップ チェーンで提示されたもの) が実際に画面によって描画されているときに、可能な限り正確に知る必要があります。スキャン ラインを検出すると、その測定の確実性を高めることができますが、Flip または Present が呼び出された直後に垂直空白期間が終了した時点を検出するだけで作業できます。

Direct 3D 9 にはIDirect3DDevice9::GetRasterStatus メソッドがあります。このメソッドは、デバイスが垂直ブランクにあるかどうか、および現在のスキャン ラインを記述する InVBlank ブール値を含む D3DRASTER_STATUS 構造体を返します。DirectDraw にも同様の機能があります ( IDirectDraw::GetVerticalBlankStatus、また、垂直ブランク中に DDERR_VERTICALBLANKINPROGRESS を返す IDirectDraw::GetScanLine を使用して VB を検出できます)。

ただし、Direct3D11 で同様の機能を見つけることができませんでした。この機能が Direct3D9 と Direct3D11 の間で移動または削除されたかどうか、後者の場合はその理由を知っている人はいますか?

4

4 に答える 4

-2

ここでの質問はなぜですか?問題の症状を解決したいようです。多分それはあなたの本当の問題からの気晴らしです。vsyncを待つことは、AmigaまたはDOSで役立つテクニックでした。合成またはマルチスレッドOSでは完全に間違っています。

まず、何を達成したいですか?ティアリングのないレンダリングは、D3DまたはOpenGLのいずれかでスワップ間隔を設定することによって行われます。そこにあるOSよりもうまくやろうとするのは有害です。複数のモニターのような場合や、複数のアプリが同期しようとするとどうなるかを考えてみてください。

他のプロセスのクライアントであり、VSyncでタイミングを実行したい場合、残念ながら、Windowsは、私の知る限り、待機するオブジェクトを提供しません。あなたの最善の策は、現在の呼び出しに依然頼り、何が起こっているかを推定することです。

2つのケースがあります:vsyncよりも速くレンダリング(提示)している、または遅くレンダリングしている。あなたがより速いなら、Presentはあなたのためにすでにブロックするはずです。presentが待機せず、呼び出し間の時間が1/60秒を超える場合は、レンダリングの頻度を減らしたいと思われます。

人々がVSyncを気にする最も一般的なケースはビデオです。vsyncよりもはるかに高速にレンダリングできますが、適切なタイミングで表示されるのを待ちたいと考えています。そこで行う唯一のことは、できるだけ速く数フレームを実行し、その見積もりからフレームのタイミングを実行することです。いくつかのジッターとフィードバックを使用する...または、ビデオドライバーとカーネルの友達になるのに十分満足できる組み込みのハードウェアビデオを使用します。

于 2012-05-22T08:16:54.590 に答える