D3DPOOL

1.D3DPOOL_DEFAULT :
把所需的资源放置到最适合的位置,有可能是System Memory或者是Video Memory;被载入的资源不能被锁定,除非资源是动态纹理。要获取、更新资源数据只能通过一些D3D的API才可以访问,比如IDirect3DDevice9::UpdateSurface, IDirect3DDevice9::UpdateTexture, IDirect3DDevice9::GetFrontBufferData, and IDirect3DDevice9::GetRenderTargetData。如果DeviceLost丢失则在调用IDirect3DDevice9::Reset之前释放该资源。
2.D3DPOOL_MANAGED :
被该类型创建的资源会自动的被拷贝到显卡能访问的内存,系统会备份一个该资源在System Memory,所以在发生Device丢失的时候不需要重新创建该资源。D3DPOOL_MANAGED的资源能够被Lock。当System Memory中的资源被更改的时候,Direct3D会更新显卡中的资源。
3.D3DPOOL_SYSTEMMEM:
该类型的资源被创建在System Memory中,该类型在发生Device丢失的时候也不要重新创建资源。该类型资源能够被Lock,而且也能够使用IDirect3DDevice9::UpdateSurface or IDirect3DDevice9::UpdateTexture 进行更新资源。

一般而言,对于大多数的资源我们使用D3DPOOL_MANAGED来创建就可以了,因为它是放在Video Memory中的,能够被显卡直接访问,而且Direct3D还会在System Memory中备份一个该资源。比D3DPOOL_SYSTEMMEM更加有效,比D3DPOOL_DEFAULT能更有效的管理该资源决定了优先使用该类型。

这么说D3DPOOL_SYSTEMMEM岂不是没有什么用处了吗?
不是,在资源占内存比较多的时候会使用该类型。显卡的Size必定是有限制的,所以大量纹理的时候D3DPOOL_SYSTEMMEM就派上了用场,MS的人们也不是吃干饭的。

为啥说System Memory会比Video Memory慢呢?
因为GPU如果访问Systenm Memory是要走AGP总线和系统总线的,所以如果AGP总线快于系统总线则AGP总线就不能被全部利用起来,这样速度就会比直接访问Video Memory要慢。因为直接访问Video Memory去都是走的AGP总线的。
那是不是说,如果系统总线大于AGP总线就无所谓Video Memory和System Memory了,理论上System Memoy还是要比Video Memory慢,因为访问System Memory还要走CPU着一条线,所以即使总线带宽不是问题,多走了一个弯也是要慢的。

你可能感兴趣的:(OO)