注index buffers和vertex buffers不能同时使用D3DPOOL_MANAGED和D3DUSAGE_DYNAMIC创建

来源:互联网 发布:故宫纪录片知乎 编辑:程序博客网 时间:2024/04/30 06:56

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将修改更新到显存中。