关于cocos2d-x的内存管理有个疑惑,想跟大大们讨论。
现在的内存管理是借助类似objc的引用计数机制完成的,需要手动处理的retain和release比较多。在实际使用终发现retain和release的时机大多是有规律可循的,基本对应了对象的生成和消亡两个时间。那么是不是可以将管理自动化呢?分别复杂程度由小到大,能想到的是三个解决方案:
-
工厂方法
在创建对象时完全使用node的工厂方法,这样隐含的autorelease已经完成了引用释放,引擎api操作(addChild等)也会作适当的管理;那么唯一需要考虑的,是自定义对象中以成员变量方式引用的变量,需要处理retain release事项。
潜在的隐患是对autoreleasePool造成过大压力,毕竟那也是一个容器,也有消耗,但是集中触发的delete也许能挽回部分性能。 -
智能指针
boost提供了非常强大的shared_ptr,用其代替一般指针使用,可自动管理内存释放问题。由于shared_ptr的引用计数到0时是直接触发delete的,所以需要对其改造为触发一个release。这样由成员变量产生的内存管理问题也可以妥善解决。
潜在的隐患是两套内存管理并存可能引起更大的混乱。另一个是普通指针和智能指针间的相互转换,尽管可以通过重载等于号消除掉显式的reset,但另一个比较麻烦的是引擎的api是指针式的,调用函数时必须用pointer.get()的方式解开包装。 -
对象体系改造
直接对CCObject的内存管理机制改造。现在的CCObject最大的功能应该是提供一个内存管理的接口,如果利用好c++的运算符重载,完全可以在赋值时完成机械的“先release后retain”操作。但是指针的运算符是无法重载的,也就要求CCObject放弃现在的指针式引用,转变为类似java和c#的无指针对象引用。在实际使用中内存管理确实是个很头疼的问题,一直在思考如何改善,就有了以上的想法。值得说明的是,效率最高的必然是纯人工的new delete,而智能指针和对象体系改造本质上应该和retain/release的管理方式是类似的,计算消耗的差距不会太大甚至应该更优。考虑到与cocos2d-iphone版引擎的兼容,cocos2d-x很可能不会去掉retain / release的特性,所以在此分享下我的思路,期待大大们给出解决方案啊~~~