2

所以我在自己的渲染引擎上工作,遇到了一些奇怪的内存行为。

每当我打电话

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 和其他问题,这应该不是问题。

以前有没有其他人经历过这种情况,或者可以帮帮我吗?

编辑1:

在停止使用更多内存之后,这种情况会发生一定次数,大约 500 次。如果我然后卸载我的网格并重新加载它(所以它有一个不同的指针),present() 开始分配更多的内存,我的网格的大小,大约 500 次。这种情况一直持续到我的程序内存不足。

要补充一点,我第一次调用 Present() 时,它会根据我绑定的任何纹理的大小增加已用内存,这包括后台缓冲区!

4

1 回答 1

0

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

我希望这可以帮助其他人使用这个未记录的“功能”

于 2013-04-01T08:46:03.610 回答