2011-12-13 60 views
1

我目前正在使用DirectX在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(); 
} 

回答

1

关于纹理部分似乎一切都很好 - 这是足以称之为Release()LPDIRECT3DTEXTURE对象来释放它:

LPDIRECT3DTEXTURE9 textureToDelete = (*it).second; 
... 
textureToDelete->Release(); 

我有点担心stringTable - 它是地图键中负责wchar_t*的部分吗?如果是这样,你应该检查stringTable->emptyStringTable()做什么,也许没有必要手动删除密钥。

+0

我认为这也可能是对emptyStringTable()的调用。 – twsaef

0

DirectXTextureManager有任何其他方法可以调用Release()任何纹理?

如果是这样,那么可能不需要拨打clear()。特别是,检查是否存在可能已经执行清理的类析构函数或其他“UniInitialize()”方法。就个人而言,我还喜欢使用DXUT头中的SAFE_RELEASE()宏,因为在调用Release之前检查指针是否非空,并在之后将其设置为NULL。

最后,您可能会发现通过DirectX调试运行时的输出可以更轻松地进行调试,该运行时由“DirectX控制面板”(随SDK安装)进行控制。它将输出非常好的日志记录到VisualStudio输出窗口,其中包括关闭时未释放资源的详细信息,您可以使用该资源对代码进行故障排除。