所以我正在使用自己的渲染引擎,并遇到了一些奇怪的内存行为。
我什么时候打电话
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 :(得分:0)
经过大量的实验,我发现了这里发生的事情。
每次使用ID3D10Buffer
创建CreateBuffer()
时,IDXGISwapChain::Present()
将分配4千字节。对我来说,每个相同的缓冲区会发生64次,然后停止或释放先前分配的内存。
我希望这可以帮助其他人使用这个未记录的“功能”