Странное поведение памяти Direct3D в Present ()

Поэтому я работаю над собственным движком рендеринга и столкнулся со странным поведением памяти.

Когда я звоню

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 (), она увеличивает используемую память на размер любой текстуры, которую я связал, в том числе и обратный буфер!

2

Решение

После долгих экспериментов я обнаружил, что здесь происходит.
Каждый раз ID3D10Buffer создан с использованием CreateBuffer(), IDXGISwapChain::Present() выделит 4 килобайта. Для меня это происходит 64 раза на один и тот же буфер, а затем он либо останавливается, либо освобождает ранее выделенную память.

Я надеюсь, что это может помочь кому-то еще с этой недокументированной «функцией»

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector