全螢幕 Direct3D 應用程式提供給 Direct3D 執行時期一個視窗句柄。 運行時間會連結視窗。 這表示傳遞至應用程式視窗訊息程式的所有訊息,都會先由 Direct3D 運行時間自己的訊息處理程式檢查。
顯示模式變更會受到基礎作系統內建的支援例程所影響。 發生模式變更時,系統會將數則訊息廣播至所有應用程式。 在 Direct3D 應用程式中,訊息會在窗口過程線程上接收,這不一定與呼叫 IDirect3DDevice9::Reset 或 IDirect3D9::CreateDevice 的相同線程(或 IDirect3DDevice9的最終版本,這可能會導致顯示模式變更)。 Direct3D 執行時會在內部維護數個關鍵區域。 由於至少有一個關鍵區段在 IDirect3DDevice9::Reset 或 IDirect3D9::CreateDevice引發的模式切換中仍被保持,因此當應用程式收到模式變更相關的視窗訊息時,這些關鍵區段仍會被保持。
此設計對多線程應用程式有一些影響。 應用程式必須特別確保將其視窗訊息處理線程與 Direct3D 線程徹底隔離。 在一個應用程式中,如果在某個線程上造成模式變更,但在視窗程序中對不同的線程進行 Direct3D 呼叫,將有發生死結的危險。
基於這些原因, Direct3D 的設計目的是讓方法 IDirect3DDevice9::Reset、IDirect3D9::CreateDevice、IDirect3DDevice9::TestCooperativeLevel,或 IDirect3DDevice9 的最後版本,只能從處理視窗訊息的相同線程呼叫。
相關主題