2006-11-2
1.终于找到 Turtle Odyssey 工程中的关卡编辑器 Level Editor的内存泄露地方!泄露居然发生在 hgeResourceManagerEx 中!我单独测试了这个类,尤其是 GetHFlipSprite函数,它会根据传进来的 hgeSprite 对象创建与之水平翻转的新的 hgeSprite 对象。在 ~hgeResourceMangerEx 这个解析函数中-----我用了 std::list 来存储所有创建的翻转 hgeSprite对象---我这样删除这些对象的:
for( list<hgeSprite*>::iterator i = m_flipSpContainer.begin(); i != m_flipSpContainer.end(); ++ i )
{
m_hge->Texture_Free( (*i)->GetTexture() );
delete (*i);
i = m_flipSpContainer.erase( i );
}
测试程序创建了四幅翻转纹理,对应了四个hgeSprite对象。但是根据跟踪调试,发现以上循环只循环了两次!然后使用VC来查找内存泄露,正好发生了两次泄露!去掉 i = m_flipSpContainer.erase( i );
后,一切就正常了,内存泄露就解决了!
2.不要写内联虚函数。由于虚函数的存在,编译器会去创建一个虚函数表,如果让虚函数成为内联函数,则会在工程中创建大量的这个表。具体可以参看< More Effective C++ >条款24。
在《面向对象的游戏开发》中也提到过类似的问题:P74代码注释:
“Always put an empty virtual destructor in the cpp file . Being virtual , it won’t be inlined anyway , and some compliers have problems with virtual destructors defined, within headers ”
不过我觉得在很多编译器中应该会自动取消程序员在这里定义的内联属性!(事实上也是这样,即使有些函数被你定义为内联的,在编译器优化你的代码时,也会取消其内联属性)
3.为了满足 Turtle Odyssey 的需要,我写了个基于HGE的文本按钮,该按钮的外观不使用图片,而使用 hgeFont 文字外观。
目前该类已经通过测试。