2017-01-08 43 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規範中完全定義,因此供應商需要提供最優的內存管理算法。由於供應商的實現中存在一個缺陷,無法回收釋放的內存句柄,因此係統提交的與緩衝區關聯的內存不會釋放,從而導致此錯誤。