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()时,它会使用已经绑定的纹理的大小增加已用内存,这包括后台缓冲区!

+0

如果你释放之前解除绑定它仍然泄漏吗? (http://www.gamedev.net/topic/522598-debug-utility-functions-with-dx10-drawing-a-line-box-etc/) – 2013-02-27 13:03:59

+0

这是在您第一次出现时发生的吗?还是第二次? – Jimmyt1988 2013-02-27 13:37:01

+0

每次调用Present()时都会发生这种情况,直到某个大小/数量。现在看来这是〜500倍。绑定空缓冲区修复了INFO消息,但并未消除内存问题。 – Stardidi 2013-02-27 13:55:38

经过大量的实验后,我发现这里发生了什么。 每次使用CreateBuffer()创建ID3D10Buffer时,IDXGISwapChain::Present()将分配4千字节。对我而言,每个相同的缓冲区会发生64次,然后停止或释放先前分配的内存。

我希望这可能会帮助别人这个无证'功能'

+0

您不应该每帧都创建一个新的顶点缓冲区。创建资源非常昂贵,您应该重用它们。对于静态提交,你会保持很长时间的缓冲区。对于动态提交,您将使用“USAGE_DYNAMIC”并使用Map“WRITE_DISCARD”模式更新VB。 – 2015-11-19 19:25:03

+0

我完全同意这一点,这是不好的做法。但是,在正确调用发布时,它仍然不应该泄漏内存。我的猜测是它正在创建调试记录 – Stardidi 2018-01-18 22:18:46