DirectX 9到11 OpenSharedResource正在疯狂地泄漏内存.我做错什么了吗?

DirectX 9 to 11 OpenSharedResource is leaking memory like crazy. Am I doing something wrong?

本文关键字:内存 什么 泄漏 OpenSharedResource 疯狂 DirectX      更新时间:2023-10-16

我一直在与我的软件中的内存泄漏作斗争,我的应用程序的虚拟地址空间被共享内存慢慢地用完。根据泄漏的内存量,很明显是以纹理对象的形式出现的。

我已经将这个bug隔离到下面的代码示例中。我创建了一个可共享的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);
}

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

所以一般来说,你的资源将保持活动状态,直到你调用Present或强制刷新当前设备上下文。

如果您添加:

immediatecontext11->Flush();

在你的sleep调用之前,你的DirectX11资源将被正确地销毁。

相关文章: