http://www.cnblogs.com/cxrs/archive/2013/04/03/D3DResourceManager.html
1 Resource的创建与存放。
如何创建3D资源对3D应用的性能影响比较大,因此3D应用开发者最好对这部分深入了解,以便配合D3D Runtime和Display Driver把不同类型、不同用途的Resource创建在最合适的地方。
在创建D3D资源时,可以存放到三种类型的Memory:System Memory,AGP Memory, Video Memory.
- System Memory:就是系统内存,存放在System Memory上的Resource是不能直接被GPU访问的,对于GPU来说是不可见的,这种Resource必须经过拷贝才能运用到GPU的渲染中。
- AGP Memory: 也叫Share System Memory或者Non-Local Video Memory, 其实就是系统内存的一部分,只是这部分内存已经被Mapping为显存的一部分,不但CPU可以访问这部分内存,而且GPU也可以通过PCI-E/AGP总线透明访问这部分内存,就像显存一样,但GPU访问速度比显存慢,毕竟经过映射,而且还要走PCI-E总线进行读写。
- Video Memory: 显存,也叫做Local Video Memory, 只有GPU可以访问,CPU不可见也不能访问,速度最快。
对于3D应用来说,资源创建在哪里并没有完全的决定权,最终决定权在D3DRuntime和显卡驱动,以及VideoMemoryManager的策略,但是3D应用可以通过在创建资源时设置一些Flags,以便使Runtime和Driver更加正确有效的管理资源。其中有两个Flags最为关键,D3DPOOL和D3DUSAGE,两者必须配合使用。
下图为独立显卡的存储架构:
下图为集成显卡的存储架构:
2 D3DPOOL
D3DPOOL包括D3DPOOL_DEFAULT、D3DPOOL_MANAGED、D3DPOOL_SYSTEMMEM、D3DPOOL_SCRATCH。
- D3DPOOL_DEFAULT:一般存放在video memory或AGP memory中。由于在系统内存中没有备份,在Device Lost时需要释放后重新创建。
- D3DPOOL_MANAGED:和D3DPOOL_DEFAULT的区别在于D3DRuntime会在System Memory中为其创建备份,Device Lost后不需要处理,D3DRuntime会自动用备份通过显卡驱动重新创建出资源。
- D3DPOOL_SYSTEMMEM只存放于系统内存中,这种资源不能被GPU访问,Device Lost后不需要处理。
在创建Resource时,对指定 D3DPOOL时有些限制,比如创建RenderTarget和DepthStencil只能标志为D3DPOOL_DEFAULT,被指定为dynamic的resource只能标志为D3DPOOL_DEFAULT或D3DPOOL_SYSTEMMEM,详细可参考D3D SDK 文档。
3, D3DUSAGE
D3DUSAGE用于标志D3D Resource的用途,下表为D3DUSAGE和各种资源的组合。X代表此Usage可用于某Resource的创建。
Usage | Vertex buffer create | Index buffer create | Texture create | Cube texture create | Volume texture create | Surface create | Check device format |
D3DUSAGE_AUTOGENMIPMAP | x | x | x | ||||
D3DUSAGE_DEPTHSTENCIL | x | x | x | x | |||
D3DUSAGE_DMAP | x | x | |||||
D3DUSAGE_DONOTCLIP | x | x | |||||
D3DUSAGE_DYNAMIC | x | x | x | x | x | x | |
D3DUSAGE_NONSECURE | x | x | x | x | x | x | x |
D3DUSAGE_NPATCHES | x | x | |||||
D3DUSAGE_POINTS | x | x | |||||
D3DUSAGE_RTPATCHES | x | x | |||||
D3DUSAGE_RENDERTARGET | x | x | x | x | |||
D3DUSAGE_SOFTWAREPROCESSING | x | x | x | x | x | x | |
D3DUSAGE_TEXTAPI | x | x | |||||
D3DUSAGE_WRITEONLY | x | x |