DirectX 9到11 OpenSharedResource正在疯狂地泄漏内存.我做错什么了吗?
DirectX 9 to 11 OpenSharedResource is leaking memory like crazy. Am I doing something wrong?
我一直在与我的软件中的内存泄漏作斗争,我的应用程序的虚拟地址空间被共享内存慢慢地用完。根据泄漏的内存量,很明显是以纹理对象的形式出现的。
我已经将这个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资源将被正确地销毁。
相关文章:
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 重新分配向量时,向量中的内存会发生什么情况
- C++程序什么都不做,但瓦尔格林德显示内存分配
- FFMPEG,C++,内存泄漏,我做错了什么?
- 删除类成员的动态分配内存的最佳方法是什么
- C++在变量的内存地址上做什么来"deallocate"它?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- C和C++中的内存管理有什么区别
- 关于内存泄漏,我有什么不了解的
- 释放 std::vector 中指针内存的最有效方法是什么?
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 有什么方法可以识别可用的内存地址吗?
- 按引用传递和动态内存分配之间的区别是什么
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- 我可以做些什么来提高内存搜索速度?
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?