2011-05-31 31 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