Cocos2d-x自定义内存模型有哪些优点?

时间:2016-04-17 02:11:29

标签: c++ memory cocos2d-x smart-pointers dynamic-memory-allocation

当我最近开始在Cocos2d中开发时,我发现的第一个非常特殊的功能之一就是Objective-C样式的自动释放池内存模型。在我使用c ++的所有经验中,我避免使用任何形式的动态内存分配,除非绝对必要(实际上非​​常罕见)。

起初,我很困惑为什么Cocos2D没有利用更安全的替代方法来创建指针对象(例如智能指针),但后来我遇到了this线程,它讨论了{{1}的缺点关于手动保留/释放方法,相对于当前的内存范例,其中最重要的是速度。

然后我想,"为什么不定期分配一个对象并在必要时传递和存储它的引用?"我知道将Cocos2d-x的整个内存系统移植到新的范例是非常耗时的,但从长远来看,是否值得使用更稳定的惯用c ++代码?

与常规对象分配相比,当前内存模型的优势是什么呢?

2 个答案:

答案 0 :(得分:1)

游戏引擎中的内存管理是一个非常特殊的主题,特别是如果您想让您的引擎易于使用。如果你看一下虚幻引擎4,他们在内存管理方法上会更进一步,生成一个反射代码。一般来说,可以在没有明确调用retainrelease的情况下创建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的兼容性。)