`
noar
  • 浏览: 28128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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着一条线,所以即使总线带宽不是问题,多走了一个弯也是要慢的。
分享到:
评论

相关推荐

    Microsoft Direct3D 中的D3D_POOL和D3D_USAGE详解

    D3D_POOL有五个枚举值:D3DPOOL_DEFAULT、D3DPOOL_MANAGED、D3DPOOL_SYSTEMMEM、D3DPOOL_SCRATCH和D3DPOOL_FORCE_DWORD。每个枚举值都对应着不同的存储位置和资源管理策略。 D3DPOOL_DEFAULT是Direct3D的默认资源池...

    3D游戏基础Direct3D(二)D3D初始化[参照].pdf

    D3DPOOL_DEFAULT用于自动管理的资源,D3DPOOL_MANAGE由Direct3D管理,D3DPOOL_SYSTEMMEM存放于系统内存中,不直接访问,D3DPOOL_SCRATCH同样是系统内存,但用途不同。 Direct3D的初始化步骤如下: 1. 获取Direct3D...

    d3d纹理源代码让你更快了解什么叫纹理

    if (FAILED(g_pD3DDevice->CreateVertexBuffer(sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &g_pVertexBuffer, NULL))) { return E_FAIL; } // ... } ``` 这段代码创建了一个顶点缓冲...

    D3D透视制作教程从基础到源码

    g_pd3dDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL); VOID* pVertices; g_pVB->Lock(0, sizeof(g_Vertices), (void**)&pVertices, 0); memcpy...

    D3D顶点索引绘制椎体并进行纹理贴图

    device->CreateVertexBuffer(sizeof(Vertex) * numVertices, D3DUSAGE_WRITEONLY, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1, D3DPOOL_MANAGED, &vertexBuffer, NULL); void* pVertices; vertexBuffer->Lock(0, 0,...

    Direct3D编程 绘制流水线

    * D3DPOOL_SCRATCH:指定资源放在系统内存中,它与 D3DPOOL_SYSTEMMEM 不同之处在于使用这个参数使图形设备不能直接使用本内存池的资源,但资源可以被拷贝出去。 5. 双缓存切换 双缓存切换是一种技术,它可以使两...

    CreateVertexBuffer问题的代码

    4. **内存池选择**:不同的内存池(D3DPOOL_DEFAULT, D3DPOOL_MANAGED等)对性能和资源管理有不同的影响。选择不当可能会影响性能。 5. **兼容性问题**:不同的硬件或Direct3D驱动可能对某些参数有不同的支持。确保...

    Direct3D的初始化以及读取图片并透明显示

    d3dDevice->CreateTexture(width, height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture, NULL); // 将位图数据复制到纹理 D3DLOCKED_RECT lockedRect; texture->LockRect(0, &lockedRect, NULL, 0); memcpy...

    directX游戏编程实验四吴凉凉-2012329700012.doc

    Device->CreateVertexBuffer(24 *sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &VB, 0); Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); Device->...

    纹理透明度 directx 有注释 c++

    D3DXCreateTextureFromFileEx(device, "texture.png", 0, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &texture); // 设置Alpha测试和混合状态 device->SetRenderState...

    directx 3d 实例

    g_pD3DDevice->CreateVertexBuffer(sizeof(SkyVerts), D3DUSAGE_WRITEONLY, SKYFVF, D3DPOOL_DEFAULT, &g_SkyVB, NULL); char *Ptr; g_SkyVB->Lock(0,0, (void**)&Ptr, 0); memcpy(Ptr, SkyVerts, sizeof...

    DirectX函数大全

    vbDesc.Pool = D3DPOOL_DEFAULT; hr = d3ddev->CreateVertexBuffer(vbDesc, &vertexBuffer, NULL); ``` #### 三、纹理处理 纹理映射是提升图形真实感的关键技术。DirectX提供了多种方法来加载、管理和渲染纹理。 ...

    DirectSurface

    比如,系统内存池(D3DPOOL_SYSTEMMEM)适用于数据交换,而视频内存池(D3DPOOL_VIDEOMEM)则更适合高频率的图形操作,因为直接在显存中进行操作可以减少数据传输带来的延迟。 总的来说,DirectSurface是Direct3D中...

    DirectX画四边形

    D3DPOOL_MANAGED, // 管理内存池 &g_vertexBuffer, NULL))) { // 错误处理 } // 将数据写入顶点缓冲区 VOID* pVertices; if(FAILED(g_vertexBuffer->Lock(0, 0, (void**)&pVertices, 0))) { // 错误处理 } ...

    directx 程序例子 delphi 开发

    D3DDevice.CreateVertexBuffer(sizeof(Vertices), 0, D3DFVF_XYZRHW|D3DFVF_DIFFUSE, D3DPOOL_MANAGED, VB, nil); // 填充顶点 VB.Lock(0, 0, Pointer(Vertices), 0); Vertices[0].x := -1; Vertices[0].y := -...

    VC图像缩放

    D3DXCreateTextureFromFileEx(d3dDevice, "image.bmp", D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pTexture); D3DSURFACE_DESC surfaceDesc...

    dx9顶点数据

    device->CreateVertexBuffer(vbDesc, D3DPOOL_DEFAULT, &pVertexBuffer, NULL); // 填充顶点数据 MyVertex* vertices; pVertexBuffer->Lock(0, 0, (void**)&vertices, 0); // 复制顶点数据到vertices pVertexBuffer...

    绘制直线 实现

    device->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &vertexBuffer, NULL); // 锁定并填充顶点数据 void* lockedVertices; vertexBuffer->Lock(0, 0, (void**)&...

    四边形的绘制

    device->CreateVertexBuffer(sizeof(Vertex) * 4, D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_MANAGED, &vertexBuffer, NULL); Vertex* vertices; vertexBuffer->Lock(0, 0, (void**)&vertices, 0); vertices[0] = { ...

Global site tag (gtag.js) - Google Analytics