2 番目のスレッドで実行したい directx コードがあります。私は次の Direct3D9 でマルチスレッド デバイスを使用して実行するにはどうすればよいですか?を読みました。これは、多くのスレッドから同時に使用していない限り、他のスレッドから directx デバイスを使用しても問題ないと言っていますが、私はそうしていません。そして、同じスレッドから CreateDevice と CreateWindow を呼び出す必要があり、TestCooperativeLevel、Reset などの他の関数も呼び出す必要があります。
そして、私は次のことをしています:
メイン スレッドでウィンドウと directx デバイスを作成します。
2 番目のスレッドを開始し、そこでレンダリングと更新を行います。基本的には次のとおりです。
- アップデート、
- 開始シーン、
- 描く、
- エンドシーン、
- 現在;
また、メイン スレッドから TestCooperativeLevel、Reset、pDevice->Release、および pDirect3D->Release() を呼び出すようにしています。
問題
デバッグモードでテストすると、コードは機能しています。しかし、リリース モードではありません。つまり、レンダリング スレッドはすべて正常に描画されているように見えますが、メイン スレッドがブロックされているようで、メッセージを処理していないか、処理が非常に遅い場合があります。Present への呼び出しをコメントするだけであれば、すべて問題ありません (もちろん、画面には描画されません)。つまり、メイン スレッドは応答し、2 番目のスレッドも実行されます。ウィンドウとデバイスがメイン スレッドで作成されている場合、別のスレッドから Present を呼び出すときに何か問題がありますか? 次のマルチスレッドの問題を読んだとき、そのような制限はCreateDevice、TestCooperativeLevel、およびReleaseにのみあります。