Present()中的奇怪Direct3D内存行为
所以我正在处理自己的渲染引擎并遇到一些奇怪的内存行为。Present()中的奇怪Direct3D内存行为
当过我打电话
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()时,它会使用已经绑定的纹理的大小增加已用内存,这包括后台缓冲区!
经过大量的实验后,我发现这里发生了什么。 每次使用CreateBuffer()
创建ID3D10Buffer
时,IDXGISwapChain::Present()
将分配4千字节。对我而言,每个相同的缓冲区会发生64次,然后停止或释放先前分配的内存。
我希望这可能会帮助别人这个无证'功能'
您不应该每帧都创建一个新的顶点缓冲区。创建资源非常昂贵,您应该重用它们。对于静态提交,你会保持很长时间的缓冲区。对于动态提交,您将使用“USAGE_DYNAMIC”并使用Map“WRITE_DISCARD”模式更新VB。 – 2015-11-19 19:25:03
我完全同意这一点,这是不好的做法。但是,在正确调用发布时,它仍然不应该泄漏内存。我的猜测是它正在创建调试记录 – Stardidi 2018-01-18 22:18:46
如果你释放之前解除绑定它仍然泄漏吗? (http://www.gamedev.net/topic/522598-debug-utility-functions-with-dx10-drawing-a-line-box-etc/) – 2013-02-27 13:03:59
这是在您第一次出现时发生的吗?还是第二次? – Jimmyt1988 2013-02-27 13:37:01
每次调用Present()时都会发生这种情况,直到某个大小/数量。现在看来这是〜500倍。绑定空缓冲区修复了INFO消息,但并未消除内存问题。 – Stardidi 2013-02-27 13:55:38