0

我正在将我的渲染器移动到另一个线程。在此过程中,我对 IDirect3D9::CreateDevice: 进行了两次调用: 1. 从“渲染线程” - 为了创建渲染设备并正确调整其大小 2. 从“主线程” - 这里我正在创建一个用于编译着色器等的空设备。

这些调用当然可以重叠(同时进行),所以我将它们与关键部分同步。

问题是其中一个调用有时会冻结。DirectX 在此之前不会发出任何警告,因此我怀疑存在内部死锁。

我研究了文档,其中提到在单个设备上运行的所有调用,尤其是 IDirect3D9::CreateDevice、IDirect3DDevice9::TestCooperativeLevel 和 IDirect3DDevice9::Reset,都需要从同一个线程调用 - 但我已经涵盖了。

那么我错过了什么?谁能告诉我?

谢谢, 帕克萨斯

4

1 回答 1

1

我对此只有模糊的记忆,但是:

  1. 文档声明“任何创建、释放或重置设备的调用都必须使用与焦点窗口的窗口过程相同的线程来完成。”
  2. 我记得,即使您尝试使用 NULL HWND 创建设备,Direct3D 还是会在内部为您的应用程序挖掘一个。

因此,您的一个线程肯定违反了第一点。

于 2013-02-12T23:22:09.040 回答