c++ - Present() 中奇怪的 Direct3D 内存行为

标签 c++ memory directx 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和其他问题,这应该不是问题。

有没有其他人以前遇到过这种情况,或者可以帮帮我?

编辑1:

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

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

最佳答案

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

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

关于c++ - Present() 中奇怪的 Direct3D 内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15112233/

相关文章:

c++ - 实现复杂的基于旋转的相机

c# - 使用 Direct3D 时使用 C++ 而不是 C# 有什么优势吗?

c++ - 使用 0x 表示法打印地址

c++ - main() 函数中的 try\catch block 没有括号

c++ - 使用矩阵模板库(MTL 4)的矩阵乘法

c++ - 为什么覆盖在 C++ 中是可选的?

c - 函数参数是否占用本地内存空间?

c - 使用Intel的PIN工具来计算程序中缓存命中/未命中的次数

c++ - 基于共享内存的聊天应用程序的问题

c# - 如何在 C# 中编写代码以在我的机器上获取直接 X 版本?