3

假设我需要渲染静态图片(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,因为它不再需要。

问题是:

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

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

4

1 回答 1

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

于 2011-05-31T16:09:31.003 回答