2

私は Direct3D9 の初心者で、いくつかのことを試しています。「IDirect3DDevice9Ex」デバイスで「WaitForVSync」を使用したいと考えています。ただし、それを使用して VSYNC 割り込みを取得する方法がわかりません。MSDN やコード スニペットに関するヘルプはあまり見つかりませんでした。どんな助けでも大歓迎です。

ありがとう、モッツ

4

2 に答える 2

1

このコードにより、垂直ブランク期間中に (割り込みを実行するために) 関数を呼び出すことができます。タイミングの問題があるため、これはお勧めしません。縦の空白期間にいることがわかる頃には、それは終わっているかもしれません。ターゲット ハードウェアがわかっている場合は、これを考慮することができますが、関数呼び出しのレイテンシを実験的に計算する必要があります。VSYNC コールバックを使用しないことをお勧めします。とにかくそれを行うコードは次のとおりです。

D3DRASTER_STATUS rStatus;  
pd3dDevice->GetRasterStatus(0, &rStatus);

while (rStatus.InVBlank)
{
  Sleep(0); // Ensure other threads get CPU time.
  pd3dDevice->GetRasterStatus(0, &rStatus);
}

// Should be in a vertical blank period. Call your function here.
MyFunction();
于 2012-02-13T22:11:23.247 に答える
0

1) vsync が発生したときにのみディスプレイが表示されるようにする場合は、D3DPRESENT_INTERVAL_DEFAULT または D3DPRESENT_INTERVAL_ONE を使用します。

2) Present() が vsync を待機している間に何らかの処理を行いたい場合は、IDirect3DSwapChain9::Present で D3DPRESENT_DONOTWAIT フラグを使用できます。プレゼンテーション (および vsync) がまだ行われていない場合、これは D3DERR_WASSTILLDRAWING を返します。IDirect3DDevice9::GetSwapChain を呼び出して、デフォルトのスワップ チェーンを取得できます。

3) IDirect3DDevice9::GetRasterStatus を使用して、ラスター (スキャン ライン) が垂直同期領域にあるかどうかを判断することもできます。これにはドライバーとハードウェアのサポートが必要です。D3DCAPS9.Caps で D3DCAPS_READ_SCANLINE を確認することで、サポートされているかどうかを判断できます。私が知っている最新のグラフィックス ハードウェアはすべてその上限を公開していますが、使用しているモニター/テレビの年齢/タイプにも依存する場合があります。

引用元: http://www.gamedev.net/topic/319407-wait-for-vsync/

于 2011-10-14T12:02:51.213 に答える