DWM を無効にしたウィンドウ モードの Direct3D 10 で vsync に問題があります。
出力をレンダリングして表示するアプリケーションがあります。ウィンドウ モードで動作する必要があり、最低 60 fps の安定した速度を生成する必要があります。アプリケーションの 1 つのバージョンは Direct3D 9 を使用し、別のバージョンの Direct3D 10 を使用しています。ウィンドウ モードで作業しているとき、時々 fps が減少します (これは「安定した」減少ではありません。ほとんどの場合、安定した 60 fps を生成していますが、突然減少することがあります)。数秒後に 60 fps に戻ります)。アプリケーションの両方のバージョンで、fps の減少は ~10 ~ 20 fps です。それは受け入れられません。
Windows Vista と Windows 7 には、「デスクトップ コンポジション」と呼ばれる新しいグラフィック システムがあり、アプリケーションが画面にピクセルを表示する方法を変更しました。デスクトップの構成は、デスクトップ ウィンドウ マネージャー (DWM) によって実行されます。DWM が有効になっている場合、アプリケーションは、DWM によってレンダリングされ、しばらくしてディスプレイに表示されるよりも、ビデオ メモリ内のオフスクリーン サーフェスに描画されます。そのため、タスク マネージャーの dwm.exe が何もしない場合 (処理時間が ~0% の場合)、fps が低下し、dwm.exe の処理時間が 1 ~ 3% かかる場合、安定した 60 fps であることに気付きました。わかった。
私たちはそれに影響を与えることはできません。したがって、高い安定した fps を得るには、DWM をオフにする必要があります。オフにすると、すべて問題ありません。アプリケーションの両方のバージョンで安定した 60 fps があります。ただし、DWM はウィンドウ モードで vsync を実行するため、それをオフにすると、自分で vsync を実行する必要があります。
しかし、DWM をオフにすると、ウィンドウ モードの Direct3D 10 で vsync に問題が発生します。モニターの上部に画像の破れがあります。Direc3D 9 は引き続き正常に動作します。
そのため、60 Hz のリフレッシュ レートのモニターがあります。
スワップチェーンの作成中に、次のようなパラメーターを設定します。
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
プレゼンテーション中に、vsync をオンにするフラグを設定します。
m_pSwapChain->Present( 1, 0 );
そして、次の vsync 問題があります。左側から右側に高速で移動する垂直線があります。また、モニターの上部に画像の破れがあります。
http://bit.ly/POQoFq
私たちは最初、何か間違ったことをしていると思います。そこでマイクロソフトのサンプル「Tutorial 07: Texture Mapping and Constant Buffers」を回転立方体でインストールしました。立方体を大きくし、より高く配置し、回転を速くしましたが、同じ問題が発生しました (写真を参照)。
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu
したがって、フルスクリーン モードの Direct3D 10 ではすべて問題ありません。垂直同期は完全に機能します。Direct3D 9 でも問題ありません。DWM を無効または有効にしても、vsync は適切に機能します。DWM を無効にしたウィンドウ モードの Direct3D 10 では、問題があります。
さまざまなコンピューター、さまざまなビデオカード (Nvidia 8600 GT、Nvidia 9500 GT、ATI Radeon HD 5870 Eyefinity 6)、さまざまなバージョンのドライバーでテストされました。問題が安定して再現されました。Windows 7を使用しています。
では、なぜこのような問題が生じるのでしょうか。それを解決する方法と次に何をすべきか?
UPD1。上の画像が利用できない場合は、いくつかのミラーがあります。
https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313. JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG
UDP2. タイトルバーを非表示にするために、フラグ WS_POPUP を使用してウィンドウを作成していることにも注意してください (非表示にする必要があります)。画像のティアリングがさまざまな場所で発生します。常に画面の上部に表示されますが、20 ピクセルでも 50 ピクセルでもかまいません。そのため、タイトル バー付きのウィンドウを作成しているときに、画像の上部に画像のティアリングが表示されないことがあります。