【问题标题】:DirectX 9 to 11 OpenSharedResource is leaking memory like crazy. Am I doing something wrong?DirectX 9 到 11 OpenSharedResource 正在疯狂地泄漏内存。难道我做错了什么?
【发布时间】:2015-09-30 03:35:34
【问题描述】:

我一直在解决我的软件中的内存泄漏问题,我的应用程序的虚拟地址空间被共享内存慢慢耗尽。从泄露的内存量来看,很明显是以纹理对象的形式出现的。

我已将错误隔离到以下代码示例。我创建了一个可共享的 DX9 纹理对象,从 D3D11 设备打开它,然后释放它。在此示例中,在我的 NVIDIA GeForce 780 Ti 上运行 Windows 8.1,我的 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);
}

【问题讨论】:

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


    【解决方案1】:

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

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

    如果你添加:

    immediatecontext11->Flush();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 2011-05-12
      • 2013-03-16
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多