Direct3D 9) (多线程处理问题

全屏 Direct3D 应用程序提供 Direct3D 运行时的窗口句柄。 该窗口按运行时挂钩。 这意味着传递到应用程序窗口消息过程的所有消息都首先由 Direct3D 运行时自己的消息处理过程检查。

显示模式更改受基础操作系统中内置的支持例程的影响。 当模式发生更改时,系统会向所有应用程序广播多个消息。 在 Direct3D 应用程序中,消息在窗口过程线程上接收,该线程不一定是调用 IDirect3DDevice9::ResetIDirect3D9::CreateDevice (或 最终版本的 IDirect3DDevice9 的同一线程,这可能会导致) 显示模式更改。 Direct3D 运行时在内部维护多个关键部分。 由于 IDirect3DDevice9::Reset 或 IDirect3D9::CreateDevice 导致的模式开关中至少有一个关键部分保留,因此当应用程序收到与模式更改相关的窗口消息时,这些关键部分仍保留。

此设计对多线程应用程序有一些影响。 具体而言,应用程序必须确保将其窗口消息处理线程与其 Direct3D 线程紧密隔离。 导致一个线程上的模式更改,但在其窗口过程中对另一线程进行 Direct3D 调用的应用程序有死锁的危险。

出于这些原因,Direct3D 的设计使方法 IDirect3DDevice9::ResetIDirect3D9::CreateDeviceIDirect3DDevice9::TestCooperativeLevelIDirect3DDevice9 的最终版本只能从处理窗口消息的同一线程调用。

编程提示