DirectX纹理清理在c++
DirectX Texture Clean-up in C++
我目前正在使用DirectX在c++中制作游戏。这个引擎是我们学校的一位教授给我们的,我一直在检查他的引擎的内存泄漏,我相信我可以追溯到这个方法。首先,它甚至没有被调用,现在它被调用,我不确定这是否是完全删除和清理DirectX加载的纹理的正确方法。
下面是在TextureManager
上调用的方法:
void DirectXTextureManager::clear()
{
map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator it;
map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator itToErase;
it = textures->begin();
while (it != textures->end())
{
wchar_t *keyToDelete = (*it).first;
LPDIRECT3DTEXTURE9 textureToDelete = (*it).second;
itToErase = it;
it++;
textures->erase(itToErase);
delete keyToDelete;
textureToDelete->Release();
textureToDelete = NULL;
}
stringTable->emptyStringTable();
}
关于纹理部分,一切似乎都很好-在LPDIRECT3DTEXTURE
对象上调用Release()
来释放它就足够了:
LPDIRECT3DTEXTURE9 textureToDelete = (*it).second;
...
textureToDelete->Release();
我有点担心stringTable
-它是负责wchar_t*
在地图键的部分?如果是这样,您应该检查stringTable->emptyStringTable()
的功能,也许不需要手动删除密钥。
DirectXTextureManager
是否有任何其他方法可以在任何纹理上调用Release()
?
如果是,那么也许没有必要调用clear()
。特别是,检查类析构函数或其他可能已经执行清理的"UniInitialize()
"方法是否存在。就个人而言,我也更喜欢使用SAFE_RELEASE()
宏从DXUT
头,因为它检查指针是否非空之前调用释放和设置它为空之后。
最后,你可能会发现从"DirectX控制面板"(与SDK一起安装)控制的DirectX调试运行时的输出更容易调试。它将向VisualStudio输出窗口输出非常好的日志记录,其中包括关机时未释放资源的详细信息,您可以使用这些信息对代码进行故障排除。
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 纹理单位重叠?渲染了错误的纹理
- SFML 纹理变换(放大)
- SDL2 二维纹理分配/池化
- Qt OpenGL 渲染到纹理性能问题
- 为什么我会得到黑色纹理?
- glBindTexture 是否覆盖活动纹理单元的内容
- 无法将图像加载到纹理矢量 (SFML)