我注意到了DirectX api(来自AMD的驱动程序)的问题。 如果我使用增量大小的createBuffer()创建d3d缓冲区并将其释放到for循环中,内存诊断工具将显示进程的专用字节大小不断增加。我认为这可能是因为GPU映射的系统内存从未释放。顺便说一下,cpu堆大小是稳定的。用各种尺寸创建的d3dBuffer没有发布
- FOR 1000迭代缓冲器大小开始于1KB至1000使用MB
- CreateBuffer D3D11_USAGE_STAGING/D3D11_USAGE_DYNAMIC & D3D11_CPU_ACCESS_WRITE
- d3dbuffer.Release & d3dbuffer = nullptr
- 上下文。 cleastate()和flush()同步发布d3dbuffer
for (unsigned long long totalSize = 1MB; totalSize <= 1000MB ; totalSize += 1MB)
{
// create
CComPtr<ID3D11Buffer> pd3dBuffer;
D3D11_BUFFER_DESC bufferDesc;
{
ZeroMemory(&bufferDesc, sizeof(bufferDesc));
bufferDesc.ByteWidth = static_cast<UINT>(bufferSize);
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
}
HRESULT hr = pd3dDevice->CreateBuffer(&bufferDesc, NULL, pd3dBuffer);
if (FAILED(hr)) break;
//release
pd3dBuffer.Release();
pd3dDeviceContext->ClearState();
pd3dDeviceContext->Flush();
}
因为进程的内存使用不断上升,最终达到我的身体16GB的内存限制和崩溃。这很奇怪,因为我在创建后同步释放缓冲区。进程内存使用应该相对稳定。 有没有人可以解释如何不直接执行内存管理工作?
等待我看看文档 –
在映射它之后,您是否也将缓冲区解映射? –
没有涉及的映射未映射。只是创建一个同步删除(不延迟)。 – shorttermmem