所以我在开发自己的渲染引擎时遇到了一些奇怪的内存行为。
什么时候打电话
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() 时,它会根据我绑定(bind)的任何纹理的大小增加使用的内存,这包括后台缓冲区!
最佳答案
经过大量试验,我发现这里发生了什么。
每次使用 CreateBuffer()
创建 ID3D10Buffer
时,IDXGISwapChain::Present()
将分配 4 KB。对我来说,每个相同的缓冲区会发生 64 次,然后它要么停止,要么释放之前分配的内存。
我希望这可以帮助其他人使用这个未记录的“功能”
关于c++ - Present() 中奇怪的 Direct3D 内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15112233/