d3d設備基礎

1.d3d 設備創建時,類型主要有兩種,HAL(硬件抽象層)和REF(引用設備),前者基於硬件支持,速度會很快,但是不一定支持所有的d3d特徵,後者,雖然沒有硬件加速,速度很慢,但是能支持所有的

d3d特徵,一般情況下使用HAL,在出問題時,可以改成REF,如果問題不存在了,說明是硬件功能問題或顯卡驅動問題,如果問題還存在,則說明是應用程序的問題:( 。
2.使用HAL設備時,可以使用硬件頂點處理,也可以使用軟件頂點處理,(頂點處理包括,變換和光照),一般先使用硬件處理,如果失敗則使用mixed方式處理,如果還失敗,則使用軟件處理,再失敗

則報錯或放棄。
3.使用同一個Direct3D對象可以創建多個渲染設備,這多個設備之間共享一個物理資源,
此時性能會急劇下降。
4.創建設備後,要設置它的狀態.
5.create,release,reset 設備要在同一個線程中實現。
6.全屏調試可以使用DirectX Control Panel Tool,來啓動多顯示器調試。
7.一般窗口模式的應用程序在創建設備後需要處理一下步驟:
  <1>確定桌面客戶端區域的大小。
  <2>一般都設置D3DADAPTER_DEFAULT;
  <3>一般都調用IDirect3D9::CheckDeviceType來確定設備是否能支持繪製指定格式的後     臺buffer.而IDirect3D9::GetAdapterDisplayMode用來確定桌面顯示格式。
8.關於設備丟失:

<1>設備有兩種狀態,正常狀態和丟失狀態。正常狀態就是設備能正常運行並且預期渲染的狀態。當發生以下事件時有可能會引起設備丟失,比如全屏應用程序失去鍵盤焦點時,這時會導致渲染失敗。設

備丟失狀態的特點是,所有渲染函數沉默失敗,也就是,即使繪製操作失敗了,但是繪製函數返回success。在這種情況下,IDirect3DDevice9::Present
返回的錯誤代碼爲D3DERR_DEVICELOST。

<2>引起設備丟失的情況有,

(1)失去焦點,例如,按下alt+tab或一個系統對話框初始化出現。
(2)電源管理事件。
(3)其它應用程序進行全屏操作。
(4)所有的IDirect3DDevice9::Reset返回失敗時都會引起設備丟失。

<3>在設備丟失後,所有的派生自IUnknown的方法都能保證工作。

<4>在設備丟失後,每個函數一般有以下三種返回:
(1)失敗,並返回D3DERR_DEVICELOST ,應用程序認爲函數執行失敗。
(2)沉默失敗,返回S_OK,或其它返回碼,如果一個函數沉默失敗,則應用程序並不區分沉默失敗和成功。
(3)其它返回碼。

<5>設備丟失處理:
(1)一個丟失的設備在它被reset後,需要重建資源,包括顯卡資源。當一個設備丟失時,應用程序會查詢設備,檢測它是否能被恢復,如果不能,則應用程序必須等待直到設備可以被恢復。
(2)如果一個設備可以被恢復,應用程序通過銷燬所有的顯卡資源和所有的交換鏈,來爲設備作準備。然後,應用程序調用reset方法。該方法是唯一能再設備丟失後起效果的函數,也是唯一能恢復設備

狀態的函數。該函數會失敗,如果應用程序沒有完全釋放在D3DPOOL_DEFAULT中分配的資源,包括由IDirect3DDevice9::CreateRenderTarget 和IDirect3DDevice9::CreateDepthStencilSurface方法創建

的資源。
(3)在大多數情況下,頻繁調用的d3d函數,比如繪製函數,並不會返回任何有關設備是否丟失的信息。應用程序會繼續調用繪製方法,例如IDirect3DDevice9::DrawPrimitive,並不會注意設備是否丟失

。應用程序可以通過查詢IDirect3DDevice9::TestCooperativeLevel方法的返回值,來決定在遇到設備丟失時要做什麼處理。

<6>鎖操作:
d3d做了充足的工作來保證在設備丟失之後鎖操作返回succeed。然而,並不保證顯存資源數據在鎖操作期間的準確性。但是能保證鎖操作不返回錯誤代碼。這允許應用程序可以被寫入,在鎖操作期間不

用關心是否設備丟失。

<7>資源:
資源可以消耗顯存。由於丟失的設備與顯存已經失去了聯繫,所以在設備丟失期間是無法保證顯存的分配正確性的。這就導致了,所有的資源創建函數通過返回D3D_OK標示執行成功,但是實際上只是分

配了虛擬內存。因爲任何顯存資源在設備恢復之前都是要被銷燬的。這些虛擬表面允許鎖操作和拷貝操作來顯示函數的正常性,直到應用程序調用函數IDirect3DDevice9::Present 發現設備已經丟失爲

止。

<8>獲取數據:
d3d允許應用程序使用IDirect3DDevice9::ValidateDevice.方法來在硬件繪製單pass時,檢查紋理和繪製狀態的有效性。這個方法在應用程序初始化時會被調用,如果失敗丟失會返回D3DERR_DEVICELOST


d3d允許應用程序從顯存中把已經生成的或先前寫的圖片拷貝到常量系統內存資源區。由於這種圖片拷貝有可能會遇到設備丟失,d3d允許在設備丟失時拷貝函數返回fail。
拷貝操作,IDirect3DDevice9::GetFrontBufferData可以返回D3DERR_DEVICELOST ,因爲當設備丟失時,沒有主surface。IDirect3DDevice9::CreateAdditionalSwapChain 也可以返回

D3DERR_DEVICELOST來表示失敗,因爲在設備丟失時,backbuffer無法創建。注意上面說的這三種情況是除了IDirect3DDevice9::Present, IDirect3DDevice9::TestCooperativeLevel, 和

IDirect3DDevice9::Reset 之外唯一能返回D3DERR_DEVICELOST 的三種方法。

<9>可編程shader
在d3d9中頂點shader和像素shader,在reset後不需要重新創建。而在以前的directX版本中是需要重新創建的。

 

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