2011-05-31 35 views
3

假设我需要渲染静态图片(100颗星)。 我生成星星数据(位置,颜色,大小)为std :: vector stars;顶点缓冲区数据的内存管理

然后,我创建了D3D渲染类,它包含一个缓冲区:

CGalaxyMapRenderer 
{ 
    … 
    CComPtr<ID3D11Buffer> m_spStarBuffer; 
} 

在构造函数初始化我它是这样的:

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 ::矢量,因为它不再需要。

的问题是:

  1. spDevice->CreateBuffer(&vertexBuffDescr, &initVertexData, &m_spStarBuffer)); 如果内存分配将发生这种和平的代码? 它是图形内存还是当前进程内存?

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

回答

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

+0

问题是关于在CreateBuffer()调用中分配内存的位置。它是否在进程内存或视频卡板载内存中? – ToughDev 2011-06-01 09:11:41

+0

我可能是错的,但正如我在第一句中所说,它应该在进程内存中......当它们需要被渲染时,事物只会被交换到视频内存中。如果您需要http://msdn.microsoft.com/zh-cn/library/ms684884(v=vs.85).aspx,您可以使用psapi进行检查 – AJG85 2011-06-01 15:16:25