DirectX纹理清理在c++

DirectX Texture Clean-up in C++

本文关键字:c++ 纹理 DirectX      更新时间:2023-10-16

我目前正在使用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输出窗口输出非常好的日志记录,其中包括关机时未释放资源的详细信息,您可以使用这些信息对代码进行故障排除。