0

レンダラーを別のスレッドに移動しています。このプロセス中に、IDirect3D9::CreateDevice を 2 回呼び出しています。 1. 「レンダリング スレッド」から - レンダリング デバイスを作成し、適切にサイズ変更するためシェーダーなどをコンパイルするためのヌル デバイス。

もちろん、これらの呼び出しは重複する (同時に行われる) 可能性があるため、CriticalSection と同期しています。

問題は、これらの呼び出しの 1 つが時々フリーズすることです。DirectX はそれが発生する前に警告をスローしないため、内部デッドロックが疑われます。

ドキュメントを調べたところ、単一のデバイスで動作するすべての呼び出し、特に IDirect3D9::CreateDevice、IDirect3DDevice9::TestCooperativeLevel、および IDirect3DDevice9::Reset は、同じスレッドから呼び出す必要があることがわかりましたが、それについて説明しました。

それで、私は何が欠けていますか?誰か教えてください。

ありがとう、パクサス

4

1 に答える 1

1

漠然とした記憶しかありませんが、

  1. ドキュメントには、「デバイスを作成、解放、またはリセットするための呼び出しは、フォーカス ウィンドウのウィンドウ プロシージャと同じスレッドを使用して行う必要があります」と記載されています。
  2. 私が覚えているように、NULL HWND を使用してデバイスを作成しようとしても、内部的に Direct3D が進み、アプリ用に 1 つ掘り下げます。

したがって、スレッドの 1 つが確実に最初の点に違反しています。

于 2013-02-12T23:22:09.040 に答える