遺失的裝置 (Direct3D 9)
Direct3D 裝置可以處於作狀態或遺失狀態。 作業狀態是裝置執行且呈現所有呈現如預期般裝置的一般狀態。 當事件如全螢幕應用程式中鍵盤焦點遺失時,裝置會轉換到遺失的狀態,導致轉譯變得不可能。 遺失狀態的特點是所有轉譯作業的無訊息失敗,這表示即使轉譯作業失敗,轉譯方法還是可以傳回成功碼。 在此情況下,IDirect3DDevice9::P resent會傳回錯誤碼D3DERR_DEVICELOST。
根據設計,不會指定可能導致裝置遺失的完整案例集。 一些典型的範例包括失去焦點,例如當使用者按下ALT+TAB或初始化系統對話框時。 裝置也可能因為電源管理事件或另一個應用程式假設全螢幕作業而遺失。 此外,IDirect3DDevice9::Reset 使裝置處於遺失狀態的任何失敗。
所有衍生自 IUnknown 的方法,都保證會在裝置遺失之後運作。 裝置遺失之後,每個函式通常會有下列三個選項:
- 失敗並出現D3DERR_DEVICELOST - 這表示應用程式必須辨識裝置遺失,讓應用程式識別未如預期般發生某些專案。
- 以無訊息方式失敗、傳回S_OK或任何其他傳回碼 - 如果函式以無訊息方式失敗,應用程式通常無法區分「成功」和「無訊息失敗」的結果。
- 函式會傳回傳回碼。
Direct3D 9 與 Direct3D 9Ex 之間的差異: Direct3D 9 裝置會傳回D3DERR_DEVICELOST。 從 IDirect3DDevice9::P resent傳回之後,模擬行為就不會再運作,而且所有未來的呼叫都會在裝置成功重設之前失敗。 Direct3D 9Ex 裝置永遠不會傳回D3DERR_DEVICELOST,但可以傳回新的狀態消息(請參閱 裝置行為變更)。 |
回應遺失的裝置
遺失的裝置必須在重設之後重新建立資源(包括視訊記憶體資源)。 如果裝置遺失,應用程式會查詢裝置,以查看是否可以還原至作業狀態。 如果沒有,應用程式會等到可以還原裝置為止。
如果可以還原裝置,應用程式會藉由終結所有視訊記憶體資源和任何交換鏈結來準備裝置。 然後,應用程式會呼叫 IDirect3DDevice9::Reset 方法。 重設是唯一在裝置遺失時生效的方法,也是應用程式可以將裝置從遺失變更為作狀態的唯一方法。 除非應用程式釋放D3DPOOL_DEFAULT中配置的所有資源,否則重設將會失敗,包括由 IDirect3DDevice9::CreateRenderTarget 和 IDirect3DDevice9::CreateDepthStencilSurface 方法所建立的資源。
在大多數情況下,Direct3D 的高頻率呼叫不會傳回裝置是否已遺失的任何資訊。 應用程式可以繼續呼叫轉譯方法,例如 IDirect3DDevice9::D rawPrimitive,而不會收到遺失裝置的通知。 在內部,這些作業會捨棄,直到裝置重設為作業狀態為止。
應用程式可以藉由查詢 IDirect3DDevice9::TestCooperativeLevel 方法的傳回值,判斷遇到遺失裝置時要執行的動作。
鎖定作業
在內部,Direct3D 會執行足夠的工作,以確保裝置遺失后鎖定作業會成功。 不過,不保證影片記憶體資源的數據在鎖定作業期間會精確。 保證不會傳回任何錯誤碼。 這可讓應用程式在鎖定作業期間撰寫應用程式,而不需要擔心裝置遺失。
資源
資源可以使用視訊記憶體。 由於遺失的裝置與適配卡所擁有的視訊記憶體中斷連線,因此無法保證裝置遺失時配置視訊記憶體。 因此,所有資源建立方法都會藉由傳回D3D_OK來實作成成功,但實際上只配置虛擬系統記憶體。 因為任何視訊記憶體資源都必須在裝置重設大小之前終結,因此不會發生過度配置視訊記憶體的問題。 這些虛擬表面可讓鎖定和複製作業正常運作,直到應用程式呼叫 IDirect3DDevice9::P resent 並發現裝置已遺失為止。
必須先釋放所有視訊記憶體,才能將裝置從遺失狀態重設為作狀態。 這表示應用程式應該釋放任何使用 IDirect3DDevice9::CreateAdditionalSwapChain 建立的任何交換鏈結,以及放置在D3DPOOL_DEFAULT記憶體類別中的任何資源。 應用程式不需要釋放D3DPOOL_MANAGED或D3DPOOL_SYSTEMMEM記憶體類別中的資源。 轉換至作業狀態會自動終結其他狀態數據。
建議您使用單一程式代碼路徑開發應用程式,以回應裝置遺失。 此程式代碼路徑可能與啟動時初始化裝置所採用的程式代碼路徑類似,如果不相同。
擷取的數據
Direct3D 可讓應用程式使用 IDirect3DDevice9::ValidateDevice,對硬體的單一傳遞轉譯驗證紋理和轉譯狀態。 這個方法通常會在應用程式初始化期間叫用,如果裝置遺失,則會傳回D3DERR_DEVICELOST。
Direct3D 也允許應用程式將產生的或先前撰寫的影像從視訊記憶體資源複製到非volatile 系統記憶體資源。 由於這類傳輸的來源映像可能隨時遺失,因此 Direct3D 可讓這類複製作業在裝置遺失時失敗。
關於異步查詢,如果指定 FLUSH 旗標,IDirect3DQuery9::GetData 會傳回D3DERR_DEVICELOST,以便向 IDirect3DQuery9::GetData 的應用程式指出永遠不會傳回S_OK。
複製作業 IDirect3DDevice9::GetFrontBufferData,因為裝置遺失時沒有主要介面,因此D3DERR_DEVICELOST失敗。 IDirect3DDevice9::CreateAdditionalSwapChain 也可能因為裝置遺失時無法建立後台緩衝區而失敗,D3DERR_DEVICELOST。 請注意,這些案例 D3DERR_DEVICELOST是 IDirect3DDevice9::P resent、IDirect3DDevice9::TestCooperativeLevel和 IDirect3DDevice9::Reset 方法以外的唯一實例。
可程式化著色器
在 Direct3D 9 中,頂點著色器和像素著色器不需要在重設之後重新建立。 他們會記住的。 在舊版 DirectX 中,遺失的裝置需要重新建立著色器。
相關主題