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 |