2017-01-08 32 views
0

我注意到了DirectX api(来自AMD的驱动程序)的问题。 如果我使用增量大小的createBuffer()创建d3d缓冲区并将其释放到for循环中,内存诊断工具将显示进程的专用字节大小不断增加。我认为这可能是因为GPU映射的系统内存从未释放。顺便说一下,cpu堆大小是稳定的。用各种尺寸创建的d3dBuffer没有发布

  1. FOR 1000迭代缓冲器大小开始于1KB至1000使用MB
  2. CreateBuffer D3D11_USAGE_STAGING/D3D11_USAGE_DYNAMIC & D3D11_CPU_ACCESS_WRITE
  3. d3dbuffer.Release & d3dbuffer = nullptr
  4. 上下文。 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的内存限制和崩溃。这很奇怪,因为我在创建后同步释放缓冲区。进程内存使用应该相对稳定。 有没有人可以解释如何不直接执行内存管理工作?

+0

等待我看看文档 –

+0

在映射它之后,您是否也将缓冲区解映射? –

+0

没有涉及的映射未映射。只是创建一个同步删除(不延迟)。 – shorttermmem

回答

0

经过一番调查,这种奇怪的行为是由DirectX实现引起的。基本上,作为操作系统公司的微软只定义了DirectX API的接口/规格,第三方GPU厂商将不得不提供他们自己的这些API的实现。

Nvidia将提供一个,AMD将提供一个,如果突然高通公司想要支持DirectX,它将不得不编写一个。

缓冲区分配和释放机制没有在DirectX规范中完全定义,因此供应商需要提供最优的内存管理算法。由于供应商的实现中存在一个缺陷,无法回收释放的内存句柄,因此系统提交的与缓冲区关联的内存不会释放,从而导致此错误。