顶点缓冲区数据的内存管理

Posted

技术标签:

【中文标题】顶点缓冲区数据的内存管理【英文标题】:Memory management for vertex buffer data 【发布时间】:2011-05-31 11:52:21 【问题描述】:

假设我需要渲染静态图片(100 颗星)。 我将星数据(位置、颜色、大小)生成到 std::vector 星;

然后我创建一个用于 D3D 渲染的类,其中包含一个缓冲区:

CGalaxyMapRenderer

   …
   CComPtr<ID3D11Buffer> m_spStarBuffer;

在ctor中我用这种方式初始化它:

CGalaxyMapRenderer::CGalaxyMapRenderer(const std::vector<SStarData>& vecData)

   …
   const CD3D11_BUFFER_DESC vertexBuffDescr((UINT)(sizeof(SStarData)*stars.size()), D3D11_BIND_VERTEX_BUFFER); //Constant buffer?
   D3D11_SUBRESOURCE_DATA initVertexData = 0;
   initVertexData.pSysMem = &stars[0];
   spDevice->CreateBuffer(&vertexBuffDescr, &initVertexData, &m_spStarBuffer);
   …

之后我可能会销毁 std::vector,因为它不再需要了。

问题是:

    spDevice-&gt;CreateBuffer(&amp;vertexBuffDescr, &amp;initVertexData, &amp;m_spStarBuffer)); 这种和平的代码将在哪里进行内存分配? 是图形内存还是当前进程内存?

    当我不再需要渲染星系地图时(例如,当我想移动到不需要星系地图的下一个级别时),我将销毁 CGalaxyMapRenderer。 dtor 中会自动销毁 m_spStarBuffer。 问题是:清除所有缓冲资源是否足够? 还是我应该做一些额外的步骤来释放内存?

【问题讨论】:

【参考方案1】:

至于第一个问题应该是关于进程堆的图形内存一般只在需要时使用:http://msdn.microsoft.com/en-us/library/ff476501(v=vs.85).aspx

关于第二个问题,我希望通过自动销毁您的意思是 m_spStarBuffer 是一个智能指针。下面是一个创建顶点缓冲区的简单示例:http://msdn.microsoft.com/en-us/library/ff476899(v=VS.85).aspx

【讨论】:

问题是关于在 CreateBuffer() 调用中准确分配内存的位置。是进程内存还是显卡板载内存? 我可能是错的,但正如我在第一句话中所说,它应该在进程内存中......只有在需要渲染时才会将它们交换到视频内存中。如果需要msdn.microsoft.com/en-us/library/ms684884(v=vs.85).aspx,可以使用psapi查看

以上是关于顶点缓冲区数据的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 顶点缓冲

初识OpenGL VBO顶点缓冲对象

内存缓冲区管理

6LwIP协议规范翻译——缓冲及内存管理

使用“unsigned char”指向原始数据缓冲区时需要了解内存管理

RTT之内存管理及异常中断