奇怪的Direct3D内存行为在Present()
Strange Direct3D memory behavior in Present()
所以我在自己的渲染引擎上工作,遇到了一些奇怪的内存行为。
每当我呼唤
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()时,它会根据我绑定的任何纹理的大小增加已使用的内存,这包括back buffer!
经过大量的实验,我发现了这里发生的事情。每次使用CreateBuffer()
创建ID3D10Buffer
时,IDXGISwapChain::Present()
将分配4kb。对于我来说,每个相同的缓冲区发生64次,然后它要么停止,要么释放先前分配的内存。
我希望这可能会帮助其他人与这个未记录的'功能'
相关文章:
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 在 Direct3D 12 的描述符范围内设置多个描述符
- 使用 c++/WinRT Direct3D UWP Game DR 模板 Direct X11 的错误消息
- 什么是 Direct3D 12.0 上的"Map Default Buffer"?
- Direct3D和DXGI之间的区别
- tiny_obj_loader到 Direct3D 顶点缓冲区和索引缓冲区数组
- Direct3D typedef usage
- 如何在Direct3d 10中进行纹理混合
- Direct3d 11深度模板 / Alpha混合问题
- 使用CMAKE查找Direct3d 12
- IDXGISwapChain::Present Memory Leak
- 来自代码采样器的Direct3D(DirectX 9.0)代码示例
- Direct3D:尝试绘制一个三角形,但什么也没显示
- 是否覆盖Direct3D接口
- 将世界、视图和投影矩阵传递到 Direct3D 中的着色器
- 为什么当我尝试重写指向 Direct3D 设备的"EndScene"函数的指针时没有任何反应?
- 什么时候应该调整Direct3D 11后缓冲区的大小,以防止在调整大小时拉伸
- Direct3D 中的 Windows Phone 8 触摸位置
- 通过Winsock发送Direct3D顶点信息
- 奇怪的Direct3D内存行为在Present()