当我最近开始在Cocos2d中开发时,我发现的第一个非常特殊的功能之一就是Objective-C样式的自动释放池内存模型。在我使用c ++的所有经验中,我避免使用任何形式的动态内存分配,除非绝对必要(实际上非常罕见)。
起初,我很困惑为什么Cocos2D没有利用更安全的替代方法来创建指针对象(例如智能指针),但后来我遇到了this线程,它讨论了{{1}的缺点关于手动保留/释放方法,相对于当前的内存范例,其中最重要的是速度。
然后我想,"为什么不定期分配一个对象并在必要时传递和存储它的引用?"我知道将Cocos2d-x的整个内存系统移植到新的范例是非常耗时的,但从长远来看,是否值得使用更稳定的惯用c ++代码?
与常规对象分配相比,当前内存模型的优势是什么呢?
答案 0 :(得分:1)
游戏引擎中的内存管理是一个非常特殊的主题,特别是如果您想让您的引擎易于使用。如果你看一下虚幻引擎4,他们在内存管理方法上会更进一步,生成一个反射代码。一般来说,可以在没有明确调用retain
或release
的情况下创建cocos2d-x游戏。当您需要手动延长对象的生命周期以避免删除它并再次创建它时(缓存),首先使用这些方法。
共享指针会使语法更复杂,并且会导致动态转换和绑定指针作为参数的额外困难。更重要的是,你必须使用weak_ptr和shared来避免交叉引用,这也需要额外的努力。
基本上,shared_ptr是一种像intrusive_ptr这样的引用计数技术,它可以更自然地集成到cocos2d-x中。像cocos中的addChild
/ removeChild
这样的函数正在递增和递减子对象的计数器,因此这些范例并不像第一眼看上去那么多样化。
答案 1 :(得分:0)
出于任何技术原因,我不相信Cocos2d-x使用Objective-C范例管理Ref
派生对象。如果不是更好的话,c ++智能指针(或“常规对象分配”)可能也会起作用。
然而,从历史上看,Cocos2d-x是Cocos2d项目的c ++端口 - 它是原生的Objective-C(iirc,是早期基于Python的游戏引擎的一个端口)。因此,使用AutoReleasePool以及“保留”和“释放”方法是历史性的。
现在改变它会打破很多代码并惹恼很多开发人员并为此结束?使用c ++ stl?
稍微习惯一点重要的是,Ref
对象的管理很容易,可以说比简单地教开发人员用正确的* _ptr<>包装东西要容易得多,并允许Cocos2d-x项目 - 隐藏大部分内存管理 - 维持与Cocos2d-js的功能奇偶校验。 (我认为还有一种尝试保持api与Cocos2d的兼容性。)