DirectX 9到11 OpenSharedResource像疯了一样泄漏内存。难道我做错了什么?

时间:2015-09-06 21:54:58

标签: c++ directx directx-11 directx-9

我一直在与我的软件中的内存泄漏作斗争,我的应用程序的虚拟地址空间被共享内存慢慢耗尽。根据泄漏的内存量,它非常清晰地以纹理对象的形式出现。

我已将错误隔离到以下代码示例中。我创建了一个可共享的DX9纹理对象,我从D3D11设备打开它,然后我发布它。在这个样本中,在Windows 8.1上运行我的NVIDIA GeForce 780 Ti,我的32位进程非常快地耗尽了VAS,因为这些纹理似乎没有被释放。

我是否误解了API,DirectX中是否存在错误,或者我的GPU驱动程序中是否存在错误?任何有关解决这个问题或联系谁的建议都非常感谢。

while (true)
{
    IDirect3DTexture9* tex = nullptr;
    HANDLE handle = 0;
    hr = device9->CreateTexture(1024, 1024, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &tex, &handle);
    VERIFY_SUCCEEDED(hr);

    ID3D11Texture2D* tex11;
    hr = device11->OpenSharedResource(handle, __uuidof(ID3D11Texture2D), (void**)&tex11);
    VERIFY_SUCCEEDED(hr);

    tex11->Release();
    tex->Release();

    Sleep(10);
}

如果我注释掉" OpenSharedResource"部分没有泄漏。创建并重复释放DirectX 9纹理,没有任何问题。

while (true)
{
    IDirect3DTexture9* tex = nullptr;
    HANDLE handle = 0;
    hr = device9->CreateTexture(1024, 1024, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &tex, &handle);
    VERIFY_SUCCEEDED(hr);

    //ID3D11Texture2D* tex11;
    //hr = device11->OpenSharedResource(handle, __uuidof(ID3D11Texture2D), (void**)&tex11);
    //VERIFY_SUCCEEDED(hr);

    //tex11->Release();
    tex->Release();

    Sleep(10);
}

1 个答案:

答案 0 :(得分:0)

DirectX11中的资源释放不是立即的,它在引用计数为0时发生,但也在命令完成执行后发生。

因此,通常您的资源将保持活动状态,直到您调用Present或强制刷新立即设备上下文。

如果你添加:

immediatecontext11->Flush();

在您的睡眠呼叫之前,您的DirectX11资源将被正确销毁。