d3d裝置丟失

2021-09-08 23:37:48 字數 1271 閱讀 7266

裝置丟失的典型情況:圖形顯示丟失焦點,例如按下alt+tab鍵,或者彈出乙個系統對話方塊;呼叫reset介面函式的任何錯誤也會導致裝置丟失。丟失後,所有繼承自iunknown的方法仍可以繼續正常正作,除了present()會返回d3derr_devicelost錯誤**。

處理裝置丟失:在重設(reset)丟失的裝置之前,必須重新建立所有相關的資源(包括視訊記憶體!)。在裝置丟失後,應查詢是否可以將裝置恢復(restore) 到工作狀態。如果不能,則等行直到裝置可以恢復。如果丟失的裝置可以恢復,則在恢復之前程式需要銷毀所有的視訊記憶體資源和所有的交換鏈(swap chains),然後呼叫reset()函式恢復裝置。reset函式是裝置丟失後裝置物件(lpdirect3ddevice9 device)唯一可以呼叫的函式。但是,一旦應用程式釋放了所有d3dpool_default記憶體資源,包括由函式createrendertarget()與createdepthstencilsu***ce()建立的資源,reset()的呼叫也將失敗.

大多情況下,direct3d裝置物件的許多方法並不返回裝置是否丟失的訊息,程式可以繼續呼叫圖形渲染函式,例如drawprimitive(),而不會接收到任何裝置已經丟失的訊息.在內部,這些操作將被拋棄,直到裝置恢復到工作狀態.

在裝置丟失後,程式中可以通過呼叫testcooperativelevel()介面函式確定裝置是否能夠恢復.若返回d3d_ok**,表示裝置可以恢復;若返回d3derr_devicelost**,則表示目前裝置還不能夠被恢復.

鎖定操作:裝置丟失後,d3d在內部已經做了大量的工作確保鎖定操作成功.但是不能保證在鎖定操作期間視訊記憶體的內容是準確無誤的,只能保證不會返回錯誤**.這樣應用程式就可以繼續工作,而不管裝置是否丟失.當然,這時並不會渲染出任何圖形.

有關裝置丟失的返回資料:validatedevice()確認硬體一次渲染紋理混合和渲染狀態的能力,如果裝置丟失,它會返回d3derr_devicelost; d3d允許視訊記憶體資源資料到系統記憶體的傳輸,如果裝置丟失,會導致傳輸的失敗. idirect3dquery9::getdata()可指定flush標記,如果丟失裝置,它也會返回d3derr_devicelost; 另外,既然裝置丟失時沒有主表面,那麼呼叫direct3ddevice9::getfrontbufferdata()也會失敗. 因為裝置丟失,無法建立後備緩衝,故createaddtionalswapchain()也會失敗.這些情況再加上presnet(), testcooperative(), reset(),只會在裝置丟失時出現.

可程式設計渲染器:在d3d9中,裝置從丟失到正常時,vs與ps不需要重新建立,d3d能自動恢復它們.在以前的版本中則需要重新建立.

D3D中裝置丟失的處理

d3d中裝置 device 有兩種狀態,一種是可操作狀態,也就是正常狀態,另一種是丟失狀態 lost 處於丟失狀態的裝置是不能進行渲染操 作的。簡單的說,裝置丟失是只應用程式 device 與顯示卡失去了聯絡,因此無法使用視訊記憶體。這裡的device不是只硬體,而是我們在程式中建立的 device...

D3D中裝置丟失的處理

d3d中裝置 device 有兩種狀態,一種是可操作狀態,也就是正常狀態,另一種是丟失狀態 lost 處於丟失狀態的裝置是不能進行渲染操作的。簡單的說,裝置丟失是只應用程式 device 與顯示卡失去了聯絡,因此無法使用視訊記憶體。這裡的device不是只硬體,而是我們在程式中建立的device物件...

D3D的裝置丟失處理經驗

在d3d圖形程式設計中,你是不是遇到過吃完飯回來,就發現先前執行的demo無情地被down掉了的情況。是否遇到過,在demo執行過程中,修改了螢幕解析度,demo就down掉了的情況?這就是傳說中的d3d裝置丟失。下面是一些簡單的總結。上面這個是一般方法。對於其中要進行的一些特殊處理,則視個人情況而...