Поэтому я работаю над собственным движком рендеринга и столкнулся со странным поведением памяти.
Когда я звоню
IDXGISwapChain::Present(0, 0)
это увеличивает использование памяти моих программ на размер вершин, которые я рендерил в этом кадре.
Я создаю буфер вершин, используя этот код:
ID3D10Buffer *pVertexBuffer;
D3D10_BUFFER_DESC desc;
desc.Usage = D3D10_USAGE_DYNAMIC;
desc.ByteWidth = stride * nNumVertices;
desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA vData;
vData.pSysMem = Vertices;
HRESULT hr = m_pDevice->CreateBuffer(&desc, &vData, &pVertexBuffer);
Нарисуй это используя
m_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_pDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset);m_pDevice->Draw(nNumVertices, 0);
А потом отпусти
pVertexBuffer->Release();
Это выдает ошибку
D3D10 INFO: ID3D10Device::IASetVertexBuffers: A currently bound VertexBuffer is being deleted; so naturally, will no longer be bound. [ STATE_SETTING INFO #31: IASETVERTEXBUFFERS_UNBINDDELETINGOBJECT]
Но согласно MSDN и другим вопросам, это не должно быть проблемой.
Кто-нибудь еще испытывал это раньше или мог бы помочь мне?
Edit1:
Это происходит определенное количество раз, около 500, после того, как это перестает использовать больше памяти.
Если я затем выгружаю свою сетку и перезагружаю ее (чтобы у нее был другой указатель), present () начинает выделять больше памяти, размер моей сетки, примерно в 500 раз. Это продолжается до тех пор, пока моей программе не хватит памяти.
Одна вещь, которую нужно добавить, когда я в первый раз вызываю Present (), она увеличивает используемую память на размер любой текстуры, которую я связал, в том числе и обратный буфер!
После долгих экспериментов я обнаружил, что здесь происходит.
Каждый раз ID3D10Buffer
создан с использованием CreateBuffer()
, IDXGISwapChain::Present()
выделит 4 килобайта. Для меня это происходит 64 раза на один и тот же буфер, а затем он либо останавливается, либо освобождает ранее выделенную память.
Я надеюсь, что это может помочь кому-то еще с этой недокументированной «функцией»
Других решений пока нет …