2013-02-12 100 views
0

我正在將我的渲染器移動到另一個線程。 在此過程中,我正在對IDirect3D9 :: CreateDevice進行兩次調用:1.從「渲染線程」 - 爲了創建渲染設備並正確調整其大小 2.從「主線程」 - 在這裏, m創建一個空設備,以便編譯着色器等。多線程IDirect3DDevice9 :: CreateDevice凍結

這些調用當然可以重疊(同時進行),所以我將它們與CriticalSection同步。

問題是,其中一個電話有時會凍結。 DirectX在發生之前不會發出任何警告,所以我懷疑是內部死鎖。

我研究了文檔,並提到所有在單個設備上運行的調用,尤其是IDirect3D9 :: CreateDevice,IDirect3DDevice9 :: TestCooperativeLevel和IDirect3DDevice9 :: Reset,都需要從同一個線程調用 - 但我有覆蓋。

那麼我錯過了什麼?任何人都可以告訴我嗎?

感謝, 帕克薩斯

回答

1

我只有這一個模糊的記憶,但:

  1. docs狀態「的任何呼叫建立,釋放或重置設備必須使用同一個線程來完成作爲焦點窗口的窗口過程。「
  2. 正如我所記得的一樣,即使您嘗試使用NULL HWND創建設備,內部Direct3D也會爲您的應用程序開發並挖掘一個。

因此你的一個線程肯定違反了第一點。