Memory leaks 使用各种大小创建的d3dBuffer未发布

Memory leaks 使用各种大小创建的d3dBuffer未发布,memory-leaks,directx,gpu,amd,direct3d,Memory Leaks,Directx,Gpu,Amd,Direct3d,我注意到DirectXAPI(来自AMD的驱动程序)有一个问题。 如果我使用createBuffer()以增量大小创建d3d缓冲区,并在for循环中释放它,内存诊断工具会显示进程的私有字节大小不断增加。我认为这可能是因为GPU映射的系统内存从未被释放。顺便说一句,cpu堆大小是稳定的 对于1000次迭代,缓冲区大小从1kb到1000MB开始 使用创建缓冲区 D3D11_使用_暂存/D3D11_使用_动态 &D3D11_CPU_访问_写入 d3dbuffer.Release&d3dbuffer=n

我注意到DirectXAPI(来自AMD的驱动程序)有一个问题。 如果我使用createBuffer()以增量大小创建d3d缓冲区,并在for循环中释放它,内存诊断工具会显示进程的私有字节大小不断增加。我认为这可能是因为GPU映射的系统内存从未被释放。顺便说一句,cpu堆大小是稳定的

  • 对于1000次迭代,缓冲区大小从1kb到1000MB开始
  • 使用创建缓冲区 D3D11_使用_暂存/D3D11_使用_动态 &D3D11_CPU_访问_写入
  • d3dbuffer.Release&d3dbuffer=nullptr
  • 上下文。cleastate()和flush()同步释放d3dbuffer
  • for(unsigned long long totalSize=1MB;totalSize CreateBuffer(&bufferDesc,NULL,pd3dBuffer));
    如果(失败(hr))中断;
    //释放
    pd3dBuffer.Release();
    pd3dDeviceContext->ClearState();
    pd3dDeviceContext->Flush();
    }
    
    因为进程内存使用率一直在上升,最终达到我的物理内存16gb限制并崩溃。这很奇怪,因为我在创建后立即同步释放缓冲区。进程内存使用率应该相对稳定。
    有人能解释directx内存管理是如何工作的吗?

    经过一些调查,这种奇怪的行为是由directx实现引起的。基本上,微软作为一家操作系统公司,只定义directx API的接口/规格,第三方GPU供应商必须提供自己的这些API实现

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


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

    等一下,我会看一下文档。映射后是否也要取消映射缓冲区?不涉及映射-取消映射。只需创建一个同步删除(不延迟)。
    CreateD3D11Buffer
    是您的功能之一。您应该为它发布代码。谢谢chuck,更新了!
    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();
    
    }