转自:http://www.cppblog.com/lovedday/archive/2008/05/01/48595.html
资源的概念
Direct3D资源是指用来渲染一个场景的纹理或缓冲区。应用程序需要创建、加载、复制、使用资源。Direct3D所有的资源,包括几何数据资源IDirect3DIndexBuffer9、IDirect3DVertexBuffer9等,都继承于接口IDirect3DResource9。纹理资源IDirect3DCubeTexture9,IDirect3DTexture9和IDirect3DVolumeTextre9是从接口IDirect3DResource9的子接口IDirect3DBaseTexture9中继承而来的。
1、资源属性
所有资源具有下列属性:
- 用法(usage):资源的使用方法,例如,作为一种纹理或一个渲染目标使用。
- 格式(format):数据的格式,例如一个二维表面的像素格式。
- 内存池(pool):资源所申请的内存存储空间的类型。
- 类型(type):资源的类型,例如一个顶点缓冲区或一个渲染目标。
(1)资源用法
资源的使用是强制的。在应用程序中,要以特定的操作使用资源,则在创建该资源时就必须指定使用方法。Direct3D定义了一系列的常量(以D3DUSAGE开发的大写表示符),用来表示资源使用方法,详细情况请参考DirectX帮助文档。例如D3DUSAGE_RTPATCHES,D3DUSAGE_NPATCHES和D3DUSAGE_POINTS表示的资源使用方法,通知驱动程序,在缓冲区内的数据将可能用于渲染高序元(high-order primitives)、网格patches、N-patches和点精灵(point scripts)。提供这些标志是为了防止没有主操作(host processing)时硬件不能执行这些操作。因此,驱动将在系统内存中分配这些表面,使CPU可以操作它们。如果驱动完全可以通过硬件实现这些操作,那么就能在显存中申请这些表面从而避免一次内存复制,这样至少能提高运行性能两倍。需要指出的是这些标志提供的信息不是绝对必须的。驱动能检测到这些将要对数据的操作,并将缓冲区数据移动到系统内存,进行下一帧内容的绘制。
(2)资源格式
有关资源表面格式的详细内容,可以参考DirectX帮助文档中枚举类型D3DFORMAT。
(3)内存池
资源缓冲区所占内存的类型称为内存池。内存池的值由枚举类型D3DPOOL指定,该类型定义如下:
typedef enum _D3DPOOL {
D3DPOOL_DEFAULT = 0,
D3DPOOL_MANAGED = 1,
D3DPOOL_SYSTEMMEM = 2,
D3DPOOL_SCRATCH = 3,
D3DPOOL_FORCE_DWORD = 0x7fffffff
} D3DPOOL;
如果在创建资源时使用D3DPOOL_DEFAULT内存池,则Direct3D通常会将资源保存到显存或AGP内存中,以得到更高的性能,但是,Direct3D设备丢失后,在调用IDirect3DDevice9::Reset()恢复设备前,必须释放用D3DPOOL_DEFAULT创建的资源,并且在恢复设备后必须重新创建这些资源。
使用D3DPOOL_MANAGED标志创建的资源称为托管资源。对于托管资源,Direct3D会自动在系统内存中进行备份,当设备丢失时,Direct3D将自动释放这类资源;恢复设备时也不需要重新创建,Direct3D会自动从系统内存恢复这些资源。
对于那些设备不经常访问的资源,通常使用D3DPOOL_SYSTEMMEM内存池标志创建。这些资源将常驻系统内存,所以在设备丢失后,这类资源不会丢失,恢复设备时也不需要重新创建。
D3DPOOL_DEFAULT和D3DPOOL_MANAGED资源是最常使用的两种资源,要牢记这两种资源在设备丢失和恢复时的区别。不能为同一个对象使用多种内存池,当为一个资源选定一个内存池后,该内存池就不能再改变了。
(4)资源类型
当应用程序调用一个资源创建函数如CreateCubeTexture()时,需要指定资源类型。资源类型由枚举类型D3DRESOURCETYPE指定,其枚举类型定义如下:
Defines resource types.
typedef enum D3DRESOURCETYPE
{
D3DRTYPE_SURFACE = 1,
D3DRTYPE_VOLUME = 2,
D3DRTYPE_TEXTURE = 3,
D3DRTYPE_VOLUMETEXTURE = 4,
D3DRTYPE_CubeTexture = 5,
D3DRTYPE_VERTEXBUFFER = 6,
D3DRTYPE_INDEXBUFFER = 7,
D3DRTYPE_FORCE_DWORD = 0x7fffffff,
} D3DRESOURCETYPE, *LPD3DRESOURCETYPE;
Constants
-
D3DRTYPE_SURFACE
- Surface resource. D3DRTYPE_VOLUME
- Volume resource. D3DRTYPE_TEXTURE
- Texture resource. D3DRTYPE_VOLUMETEXTURE
- Volume texture resource. D3DRTYPE_CubeTexture
- Cube texture resource. D3DRTYPE_VERTEXBUFFER
- Vertex buffer resource. D3DRTYPE_INDEXBUFFER
- Index buffer resource. D3DRTYPE_FORCE_DWORD
- Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.
2、管理资源
资源的管理工作涉及两方面,即将资源从系统内存存储区提升到设备可用存储区和将资源从设备可用存储中抛弃两个方面。以“最近最少使用”优先原则为基础,Direct3D建立了自己的管理算法。当资源数量多于在设备可用存储区中可以同时存在的资源数量,即多于作用于同一帧时的资源时(也就是说,这些资源处于函数调用IDirect3DDevice9::BeginScene()和IDirect3DDevice9::EndScene()之间),Direct3D转而采用“最近最多使用”优先原则。
不是所有的类型和用法都支持托管资源。例如,用标志D3DUSAGE_RENDERTARGET创建的对象就不支持。另外,对于那些内容频繁改变的对象,推荐不使用托管资源。例如,一个托管类型的顶点缓冲区资源的每一帧的内容都是不同的,这对于一些硬件来说,会大大降低其运行效率。但是,这对于纹理资源却不成问题。