注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将修改更新到显存中。
- 注index buffers和vertex buffers不能同时使用D3DPOOL_MANAGED和D3DUSAGE_DYNAMIC创建
- Using Dynamic Vertex and Index Buffers
- Vertex and Index Buffers在OGRE中的应用
- Direct3D - Vertex Buffers
- buffers和cached
- Google Protocol Buffers安装和使用
- Protocol Buffers的基础说明和使用
- Buffers
- buffers和cache的区别
- buffers和cache的区别
- Protocol Buffers的安装使用和C++入门示例
- Protocol Buffers的安装使用和C++入门示例
- Protocol Buffers的安装使用和C++/Python入门示例
- Linux Buffers和Cached的区别
- Google Protocol Buffers介绍和总结
- Google Protocol Buffers介绍和总结
- Linux Buffers和Cached的区别
- free命令中的buffers和cached
- Python 于 webgame 的应用(上)
- 临时对象的来源
- basex - XML数据库 浅谈
- 偏执狂的原创伤感日志:珍惜你们的缘分;幸福
- 异常处理总结(一)
- 注index buffers和vertex buffers不能同时使用D3DPOOL_MANAGED和D3DUSAGE_DYNAMIC创建
- IOS开发之关键字synchronized
- vc6.0配置头文件,和库文件
- 不是读后感的读后感
- 贪财的富翁
- Android Vers & its APIs、CuteName
- Tomcat配置: The archive: /bin/bootstrap.jar which is referenced by the classpath, does not exist.
- 详解MYSQL数据库密码的加密方式及破解方法
- 异常处理总结(二)