1

2 番目のスレッドで実行したい directx コードがあります。私は次の Direct3D9 でマルチスレッド デバイスを使用して実行するにはどうすればよいですか?を読みました。これは、多くのスレッドから同時に使用していない限り、他のスレッドから directx デバイスを使用しても問題ないと言っていますが、私はそうしていません。そして、同じスレッドから CreateDevice と CreateWindow を呼び出す必要があり、TestCooperativeLevel、Reset などの他の関数も呼び出す必要があります。

そして、私は次のことをしています:

  1. メイン スレッドでウィンドウと directx デバイスを作成します。

  2. 2 番目のスレッドを開始し、そこでレンダリングと更新を行います。基本的には次のとおりです。

    • アップデート、
    • 開始シーン、
    • 描く、
    • エンドシーン、
    • 現在;
  3. また、メイン スレッドから TestCooperativeLevel、Reset、pDevice->Release、および pDirect3D->Release() を呼び出すようにしています。

問題

デバッグモードでテストすると、コードは機能しています。しかし、リリース モードではありません。つまり、レンダリング スレッドはすべて正常に描画されているように見えますが、メイン スレッドがブロックされているようで、メッセージを処理していないか、処理が非常に遅い場合があります。Present への呼び出しをコメントするだけであれば、すべて問題ありません (もちろん、画面には描画されません)。つまり、メイン スレッドは応答し、2 番目のスレッドも実行されます。ウィンドウとデバイスがメイン スレッドで作成されている場合、別のスレッドから Present を呼び出すときに何か問題がありますか? 次のマルチスレッドの問題を読んだとき、そのような制限はCreateDevice、TestCooperativeLevel、およびReleaseにのみあります。

4

1 に答える 1

4

メッセージ ポンプを実行しているスレッドとは別のスレッドから Present が呼び出されると、デッドロックが発生する可能性があります。詳細はこちら: マルチスレッドと DXGI

于 2012-07-02T18:28:14.977 に答える