0

一連のリソースをロード/ダウンロードし、現在ロードされているファイルをユーザーに通知できるようにしたいのですが、v-sync が描画できるまで待機するため、各ファイルのロードが開始された後にフレームを描画することはできません。継続する前のフレーム (負荷を 60/秒未満にボトルネック化)。

デバイスが描画の準備ができているかどうかを確認する方法はありますか (ハックせずに「1/60 秒はまだ経過していますか?」)、準備ができるまでアクションを実行できますか? 通知がスキップされてもかまいません。描画の準備が整う前に終了したファイルですが、ユーザーに通知できるようにしながら、読み込みの速度を最大化したい.

また、コンピューターの読み込みが非常に速い場合に、グラフィック カードが 300 FPS レートを壊すようなことはしたくないので、v-sync を一時的に無効にすることは避けたいと思います。

4

1 に答える 1

1

使用している Direct3D のバージョンは指定しません。D3D9 では、Present() 呼び出しに D3DPRESENT_DONOTWAIT を渡すことができ、ハードウェアが処理中または垂直同期間隔を待っている場合、D3DERR_WASSTILLDRAWING が返されます。これは、vsync が有効になっている場合、メイン ループで、ファイルをロードしたときに DONOTWAIT フラグを指定して Present を呼び出し、WASSTILLDRAWING が返された場合は別のファイルをロードできることを意味します。

このフラグを present に渡すには、デバイスで直接 Present() を呼び出すのではなく、スワップ チェーンを取得してスワップ チェーンで Present() を呼び出す必要があることに注意してください。または、IDirect3DDevice9 デバイスの代わりに IDirect3DDevice9Ex を作成し、Present() の代わりに PresentEx() を呼び出します。

ただし、ロードにフレームよりも時間がかかるファイルの問題は解決しません。処理に時間がかかるファイルがあると、フレーム レートが低下します。私の意見では、この問題に対するより良い解決策は、できるだけ多くの IO を別のスレッドに移動することです (ただし、D3D9 では、メイン スレッドで D3D リソースを作成する必要があります)。現在存在するファイルの名前を渡すだけです。フレームを表示するたびにメイン/レンダリング スレッドに処理されて表示されます。

于 2011-06-23T18:16:24.260 に答える