D3D中裝置丟失的處理

2021-09-08 07:22:41 字數 2246 閱讀 6770

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

當某些事件發生時,裝置會由正常狀態轉換到丟失狀態。這些事件包括

裝置丟失以後,大多數渲染操作都只是silent failure,所以仍然會返回正確**,但是present函式會返回d3derr_devicelost,所以可以檢測該函式的返回值,如果該函式失敗,那麼就重置裝置。當然失敗可能還有其他原因,不僅僅是裝置丟失而已,這些情況我們都在resetdevie函式裡面一併處理。

//

present the back buffer contents to the display

hresult hr = g_pd3ddevice->present(null, null, null, null);

//render failed, try to reset device

if(failed(hr))

裝置丟失以後,應該進行重置(reset),可以使用reset函式來重置裝置,reset函式是裝置丟失以後唯一起作用的函式,也是唯一能將裝置從丟失狀態恢復到正常狀態的函式。由於裝置丟失後,裝置與顯示卡就失去了聯絡,所以一切與顯示卡有關的資源也都無法再通過裝置訪問了,那麼這些資源必須釋放並重新建立,一般來說,以d3dpool_default為引數建立的資源,都是在顯示卡中分配的記憶體,所以,在重置裝置之前要保證所有d3dpool_default型別的資源都必須釋放掉,而且如果程式中使用了額外的swapchain,那麼也要重新建立之,否則reset函式會失敗。裝置丟失的處理可以大致分成如下三個步驟

使用testcooperativelevel函式檢測當前裝置狀態,如果可以重置,則重置,並重建使用d3dpool_default建立的資源及swapchain。

如果裝置仍然處於丟失狀態,則等待一段時間

如果是其他狀態,比如驅動內部錯誤,則告知使用者(比如顯示錯誤框)

處理裝置丟失的**如下

//

reset device

hresult resetdevice(d3dpresent_parameters d3***)

else

//reset device failed, show error box

}//device is still in lost state, wait

elseif (hr ==d3derr_devicelost)

else

//other error, show error box

return

hr ;

}

需要注意的是,在重置device的過程中(即呼叫reset函式時),仍然會發生錯誤,這時我們簡單的輸出乙個錯誤框告知使用者。由於重置裝置後,視窗的大小可能改變,所以我們要呼叫resized3dscene來調整投影視窗的縱橫比,該函式如下

//

reset the scene by rebuild the viewing frustum

void resized3dscene(int width, int

height)

如果不能正確的處理裝置丟失,則d3d程式經常會產生莫名其妙的現象 ,我們可以使用如下方法驗證

1 在程式處於渲染狀態時(視窗或者全屏態皆可)按下鎖屏鍵(win+l),然後返回程式,看看渲染內容是否丟失。

2 在程式處於全屏狀態時,按下win+d回到桌面,或者按下atl+tab切換到其他程式,然後在再到渲染程式,看看渲染內容是否丟失。

3 還有其他的,大家發揮想象力。。。

前面討論的情況都是針對xp系統而言,如果你使用的是window vista及更高版本,那麼情況則有所不同了,vista使用的是wddm driver(windows device driver model),而xp使用的是xpdm (xp driver model),前面說了,裝置丟失的情況很多,並沒有乙個完整的列表來描述這些情況,但是在vista系統上則不然,裝置丟失只有兩種情況,一是硬體hanging,另一種是driver stopped。

在以前版本的dx中,當應用程式經歷模式改變時,唯一的恢復辦法就是reset device並重新建立所有視訊記憶體資源及swap chain,但是在vista上的directx,在模式改變後呼叫reset函式,紋理記憶體不會丟失,紋理渲染狀態資訊也不會丟失,這些資源都不必重新建立了。

D3D中裝置丟失的處理

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

D3D中裝置丟失的處理

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

d3d裝置丟失

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