我一直在与我的软件中的内存泄漏作斗争,我的应用程序的虚拟地址空间被共享内存慢慢耗尽。根据泄漏的内存量,它非常清晰地以纹理对象的形式出现。
我已将错误隔离到以下代码示例中。我创建了一个可共享的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);
}
答案 0 :(得分:0)
DirectX11中的资源释放不是立即的,它在引用计数为0时发生,但也在命令完成执行后发生。
因此,通常您的资源将保持活动状态,直到您调用Present或强制刷新立即设备上下文。
如果你添加:
immediatecontext11->Flush();
在您的睡眠呼叫之前,您的DirectX11资源将被正确销毁。