D3DPOOL詳解



翻譯自:http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb172584(v=vs.85).aspx

定義資源緩存的存儲位置。

 

VIDEO MEMORY(VM)

顯卡上的顯存,CPU只能通過AGP或PCI-E總線訪問,讀寫速度都是非常慢的,CPU連續寫VM稍微快於讀,因爲CPU寫VM時會在CACHE中分配32或64個字節(取決於CACHE LINE長度)的寫緩衝,當緩衝滿後會一次性寫入VM。

SYSTEM MEMORY(SM):

就是系統內存,存放在System Memory上的Resource是不能直接被GPU訪問的,對於GPU來說是不可見的,這種資源CPU讀寫都很快,但必須經過拷貝到VMAM中才能在GPU中渲染

AGP MEMORY(AM):

實際也存在於系統內存中,只是這部分內存已經被Mapping爲顯存的一部分,不但CPU可以訪問這部分內存,而且GPU也可以通過PCI-E/AGP總線透明訪問這部分內存,就像顯存一樣,但GPU訪問速度比顯存慢,畢竟經過映射,而且還要走PCI-E總線進行讀寫。

CPU連續的寫會稍微快於讀,原因就是CPU寫AM使用了“writecombining”,GPU訪問AM內存比較慢

D3DUSAGE_DYNAMIC會將資源放置在AM中。

 

D3DPOOL_DEFAULT:

此類資源不由D3D管理,常駐在顯存或者AGP內存中渲染效率高;丟失需要重新創建;鎖定讀比較麻煩,一般設置爲D3DUSAGE_WRITEONLY

   資源放置在顯存或者AGP內存中,D3DPOOL_DEFAULT和D3DPOOL_MANAGED、D3DPOOL_SYSTEMMEM是不能同時存在的。

當設備丟失了(可能發生在窗口和全屏模式切換,或者不切換但修改分辨率),被D3DPOOL_DEFAULT創建的資源,在IDirect3DDevice9::Reset調用之前,必須被用release釋放掉。使用D3DPOOL_DEFAULT創建資源時,如果內存不夠用,那麼managedresource會釋放一些內存空間來滿足需要。

   D3DPOOL_DEFAULT內存池中的紋理是不能鎖定的,除非是D3DUSAGE_DYNAMIC使用方式的紋理或者是私有、FOURCC、

驅動格式的紋理。一些使用driver特有的像素格式創建的紋理,無法被Direct3D runtime識別,也是可以鎖定的。

與texture不同的是,swapchain back buffers, render targets, vertex buffers和indexbuffers都是可以鎖定的,

   去訪問沒有成功鎖定的紋理,你必須使用IDirect3DDevice9::UpdateSurface, IDirect3DDevice9::UpdateTexture,

IDirect3DDevice9::GetFrontBufferData,and IDirect3DDevice9::GetRenderTargetData.

   D3DPOOL_MANAGED is probably a better choicethan D3DPOOL_DEFAULT for most applications.

 

適用情況:有時候我們希望將某些資源一直放在顯存裏,以提高訪問速度。同時使用D3DUSAGE_WRITEONLY標記會提高效率。

例子:遊戲中使用的光標貼圖,在遊戲運行過程中一直要使用,可以直接創建在顯存中。
 如果數據需要高頻率更新(不斷的Lock, Unlock),也需要使用D3DPOOL_DEFAULT,同時使用D3DUSAGE_DYNAMIC標記。這意味着此資源會被創建在AGP Memory中。
 例子:使用CPU進行物理運算的粒子系統、使用CPU計算蒙皮的骨骼動畫

 

注意:

   D3DPOOL_MANAGED 不一定會將貼圖資源放到顯卡里面,換句話說通常只有在貼圖被使用的時候纔會交換到顯存中。

所以用D3DPOOL_MANAGED創建的時候數據大多數情況只是內存之間的傳輸(如果顯卡總線忙也不影響繼續加載),

而D3DPOOL_DEFAULT則在創建的時候就要不斷的向顯存中傳輸數據。如果你的資源是一起創建的,很容易造成了顯卡

總線滿載,後面的貼圖要等待前面的貼圖完全傳送到顯卡上了,才能開始傳輸。這種排隊可能是造成你過慢的原因。

   我原來也嘗試過 用D3DPOOL_DEFAULT,總覺得丟失回覆的速度太慢了。另外顯存交換也非常麻煩,

綜合起來還不如D3DPOOL_MANAGED,所以貼圖資源不建議使用D3DPOOL_DEFAULT

 

D3DPOOL_MANAGED

交給D3D託管,渲染效率一般(系統RAM/AGP內存/顯存中都有); 設備丟失會自動恢復; 鎖定讀寫效率較高。

資源交給D3D自動管理,資源會在系統內存中備份一份,在資源需要渲染的時候,會自動拷貝一份到AGP內存、顯存中進行渲染。

當設備丟失時,D3D會自動恢復顯存中的數據。

D3DPOOL_MANAGED的資源可以自由的鎖定。

但是隻有系統內存中的副本資源數據可以直接的修改,當需要渲染的時候D3D會自動的拷貝到AGP內存和顯存中。

 

適用情況:由於D3D自己的資源管理方案很高效、使用簡單,遊戲中大部分資源都可以使用此標識創建

例子:遊戲中使用的大部分紋理貼圖,靜態模型

 

D3DPOOL_SYSTEMMEM:

直接放置在系統中,渲染效率較差需要用UpdateSurface或UpdateTexture拷貝到D3DPOOL_DEFAULT創建的資源,

設備丟失時候不需要重新創建資源,鎖定很方便CPU處理較快。

資源放置在系統RAM,但是不會減少RAM的可訪問頁,不能夠被Direct3D 設備直接訪問。當設備丟失的時候,這些資源不需要

重新創建。這些資源可以被鎖定(讀寫),可以通過IDirect3DDevice9::UpdateSurfaceor IDirect3DDevice9::

UpdateTexture函數,將該類型的資源數據,設置爲用D3DPOOL_DEFAULT創建的資源的數據來源。

使用:

對於需要高頻CPU讀寫處理的數據,推薦使用這種方式。

 

D3DPOOL_SCRATCH:

    直接放置在系統中,不能直接的交給D3D渲染,設備丟失時候不需要創建資源,不被設備像素格式限制可以創建鎖定拷貝。

這些資源放置在系統RAM中,當設備丟失時不需要重新創建數據。這些數據不被設備大小和像素格式的限制。正因爲如此,

這些資源不能被Direct3D訪問,不能夠設置爲紋理或者設置爲渲染目標。然而,這些資源之間總是可以被創建,鎖定和拷貝。

使用:

Directx 9引入這種內存池的原因是由於它從API中刪除了CreateImageSurface()的函數。通常,D3DPOOL_SCRATCH是連同CreateOffscreenPlainSurface()一起使用的,後者將返回一個與之前通過CreateImageSurface()來創建的、具有相同特徵的表面。因此,它主要用於創建圖像表面

 

D3DPOOL_FORCE_DWORD:

強制編譯器將本參數類型編譯爲32bit,如果沒有使用這個值,一些編譯器將會把本參數編譯爲一個大於或小於32bit的值。

這個值現在是沒有使用的。

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