Управление памятью для данных буфера вершин - PullRequest
3 голосов
/ 31 мая 2011

Предположим, что мне нужно сделать статическую картинку (100 звезд).Я генерирую звездные данные (положение, цвет, размер) для std :: vector stars;

Затем я создаю класс для D3D-рендеринга, который состоит из буфера:

CGalaxyMapRenderer
{
   …
   CComPtr<ID3D11Buffer> m_spStarBuffer;
}

В ctor Iинициализируйте его следующим образом:

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.Произойдет автоматическое уничтожение m_spStarBuffer в dtor.Вопрос: достаточно ли очистить все ресурсы буфера?Или я должен сделать некоторые дополнительные шаги, чтобы освободить память?

1 Ответ

2 голосов
/ 31 мая 2011

Что касается первого вопроса, он должен быть в графической памяти кучи процесса, используется только при необходимости в общем случае: 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

...