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

时间:2011-05-31 11:52:22

标签: c++ direct3d vertex-buffer

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

然后我为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,因为它不再需要了。

问题是:

  1. spDevice->CreateBuffer(&vertexBuffDescr, &initVertexData, &m_spStarBuffer)); 这种代码安静会进行内存分配吗? 它是图形内存还是当前进程内存?

  2. 当我不再需要渲染星系图时(例如,当我想移动到下一级时,不需要星系图),我将破坏CGalaxyMapRenderer。 在dtor中会自动销毁m_spStarBuffer。 问题是:是否足以清除所有缓冲资源? 或者我应该做一些额外的步骤以使内存空闲?

1 个答案:

答案 0 :(得分:2)

关于第一个问题,它应该在进程堆上,图形内存仅在需要时才使用: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