D3DPOOL(资源池)
D3DPOOL定義了資源對應的內存類型,資源可以是texture surface, vertex buffer等,從內存的角度來看,資源有以下幾種類型。
D3DPOOL_DEFAULT
D3DPOOL_MANAGED
D3DPOOL_SYSTEMMEM
D3DPOOL_SCRATCH
D3DPOOL_FORCE_DWORD
D3DPOOL_DEFAULT
資源被存儲在最適合給定資源訪問的內存中,這通常是顯存,包括本地顯內存和AGP內存,D3DPOOL_DEFAULT不同于D3DPOOL_MANAGED和D3DPOOL_SYSTEMMEM,它指出了資源被存儲在最適合設備訪問的內存中,D3DPOOL_DEFAULT指出D3DPOOL_MANAGED和D3DPOOL_SYSTEMMEM永遠都不會作為資源內存的備選類型,使用D3DPOOL_DEFAULT分配的紋理資源是無法鎖定的,除非該紋理是動態紋理或者是私有的FOURCC driver 格式。想要訪問無法所定的紋理資源,必須使用如下函數
IDirect3DDevice9::UpdateSurface
IDirect3DDevice9::UpdateTexture
IDirect3DDevice9::GetFrontBufferData
IDirect3DDevice9::GetRenderTargetData
對大多數應用程序來說,使用D3DPOOL_MANAGED是一個更好的選擇。一些使用driver特有的像素格式創建的紋理,無法被Direct3D runtime識別,也是可以鎖定的。與texture不同的是,swap chain back buffers, render targets, vertex buffers和index buffers都是可以鎖定的,當設備丟失時,所有使用D3DPOOL_DEFAULT創建的資源必須在調用Reset函數前釋放掉,使用D3DPOOL_DEFAULT創建資源時,如果內存不夠用,那么managed resource會釋放一些內存空間來滿足需要。
D3DPOOL_MANAGED
資源按需自動被拷貝到設備能訪問的內存中。托管資源由系統內存備份,所以設備丟失時無需重建。托管資源可以被鎖定,只有系統備份的那份內存能直接被修改。Direct3D按需將修改拷貝到設備可訪問的內存中。
D3DPOOL_SYSTEMMEM
資源被分配在不能被設備直接訪問的內存中。這些內存消耗系統的RAM但是并不減少可分頁的RAM。這些資源不必在設備丟失時重建。這種資源也可以被鎖定,并且可以用作函數IDirect3DDevice9::UpdateSurface或IDirect3DDevice9::UpdateTexture的源,這兩個函數的操作目標都是D3DPOOL_DEFAULT類型的資源。
D3DPOOL_SCRATCH
資源分配在系統RAM中并且無需在設備丟失時重建。這種資源不受設備大小和格式的限制。因此,這種資源不能被Direct3D設備使用,也不能設置為紋理或者Render targets,盡管如此,這種資源也可以被創建,鎖定和拷貝。
D3DPOOL_FORCE_DWORD
強制該類型編譯為32bit大小,沒有這個值,一些編譯器將會把這個枚舉類型編譯為非32bit大小的類型,該值暫未使用。
所有的內存類型適用于所有的資源類型,包括Vertex Buffers, Index Buffers, textures和Surfaces
下面的表指出了資源的內存類型及用法之間的兼容關系,x表示兼容
同一個資源中的不同對象間的資源池不能混合(mip levels in a mipmap),并且當一個資源池被選中時就不能被改變了。
對于大多數靜態資源,應用程序應該使用D3DPOOL_MANAGED,因為這使得應用程序不必處理設備丟失。這在統一內存架構的系統(UMA)上顯得尤為有益。其他動態資源類型并不適合使用D3DPOOL_MANAGED,實際上,index buffers和vertex buffers不能同時使用D3DPOOL_MANAGED和D3DUSAGE_DYNAMIC創建。
對于動態紋理,有時需要使用一對內存,一個是使用D3DPOOL_DEFAULT分配的顯存,另一個是使用D3DPOOL_SYSTEMMEM分配的系統內存。可以用鎖定的方法在系統內存上修改紋理,并使用函數IDirect3DDevice9::UpdateTexture將修改更新到顯存中。
本文轉自zdd博客園博客,原文鏈接:http://www.cnblogs.com/graphics/archive/2011/02/13/1953083.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的D3DPOOL(资源池)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 预处理器预处理变量头文件保护条件编译
- 下一篇: 常见面试代码总结