設備丟失

 設置丟失



設備丟失的典型情況:圖形顯示丟失焦點,例如按下alt+tab鍵,或者彈出一個系統對話框;調用Reset接口函數的任何錯誤也會導致設備丟失。丟失後,所有繼承自IUnknown的方法仍可以繼續正常正作,除了Present()會返回D3DERR_DEVICELOST錯誤代碼。



處理設備丟失:在重設(reset)丟失的設備之前,必須重新創建所有相關的資源(包括顯存!)。在設備丟失後,應查詢是否可以將設備恢復(restore) 到工作狀態。如果不能,則等行直到設備可以恢復。如果丟失的設備可以恢復,則在恢復之前程序需要銷燬所有的顯存資源和所有的交換鏈(swap chains),然後調用Reset()函數恢復設備。Reset函數是設備丟失後設備對象(LPDIRECT3DDEVICE9 device)唯一可以調用的函數。但是,一旦應用程序釋放了所有D3DPOOL_DEFAULT內存資源,包括由函數CreateRenderTarget()與CreateDepthStencilSurface()創建的資源,Reset()的調用也將失敗.

大多情況下,DIRECT3D設備對象的許多方法並不返回設備是否丟失的消息,程序可以繼續調用圖形渲染函數,例如DrawPrimitive(),而不會接收到任何設備已經丟失的消息.在內部,這些操作將被拋棄,直到設備恢復到工作狀態.

在設備丟失後,程序中可以通過調用TestCooperativeLevel()接口函數確定設備是否能夠恢復.若返回D3D_OK代碼,表示設備可以恢復;若返回D3DERR_DEVICELOST代碼,則表示目前設備還不能夠被恢復.



鎖定操作:設備丟失後,D3D在內部已經做了大量的工作確保鎖定操作成功.但是不能保證在鎖定操作期間顯存的內容是準確無誤的,只能保證不會返回錯誤代碼.這樣應用程序就可以繼續工作,而不管設備是否丟失.當然,這時並不會渲染出任何圖形.



資源:在設備丟失時,設備與顯卡的內存不再相關聯,因此,顯存裏的資源將全部被銷燬,必須全部重新創建.而在設備丟失期間,對資源空間的分配也只能在內存上實現,無法在顯存上分配內存空間.這些假的表面資源看上去允許正常鎖定與複製操作,直到調用present函數會發現設備已經丟失.在從設備丟失狀態恢復到正常值時,所有視頻內存必須被釋放,意味着應用程序需要釋放所有由CreateAdditionalSwapChain()函數所創建的交換鏈和所有D3DPOOL_DEFAULT內存類型的資源,而不用釋放D3DPOOL_MANAGED和D3DPOOL_SYSTEMMEM內存類型的資源.(因顯存裏那些資源可能在設備丟失時被改動過了,必須釋放後重新申請,並載入).



有關設備丟失的返回數據:ValidateDevice()確認硬件一次渲染紋理混合和渲染狀態的能力,如果設備丟失,它會返回D3DERR_DEVICELOST; D3D允許顯存資源數據到系統內存的傳輸,如果設備丟失,會導致傳輸的失敗. IDirect3DQuery9::GetData()可指定FLUSH標記,如果丟失設備,它也會返回D3DERR_DEVICELOST; 另外,既然設備丟失時沒有主表面,那麼調用Direct3DDevice9::GetFrontBufferData()也會失敗. 因爲設備丟失,無法創建後備緩衝,故CreateAddtionalSwapChain()也會失敗.這些情況再加上Presnet(), TestCooperative(), Reset(),只會在設備丟失時出現.



可編程渲染器:在D3D9中,設備從丟失到正常時,VS與PS不需要重新創建,D3D能自動恢復它們.在以前的版本中則需要重新創建

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章