Cocos2d-x自定义内存模型有什么优势?
What are the advantages of Cocos2d-x custom memory model?
当我最近开始在 Cocos2d 中开发时,我发现的第一个非常奇特的功能是 Objective-C 样式的自动释放池内存模型。在我使用 c++ 的所有经验中,我避免使用任何形式的动态内存分配,除非绝对必要(这实际上非常罕见)。
起初,我很困惑为什么 Cocos2D 没有利用更安全的替代方法来创建指针对象(例如智能指针),但后来我遇到了 this 线程,它讨论了shared_ptr<class T>
(其中最重要的是速度)相对于当前内存范例的手动保留/释放方法的缺点。
然后我想,"why not simply allocate an object regularly and pass and store its reference when necessary?"我明白将Cocos2d-x的整个记忆系统移植到一个新的范式是非常耗时的,但在漫长的运行使用更稳定的惯用 C++ 代码不值得吗?
归根结底,与常规对象分配相比,当前内存模型的优势是什么?
游戏引擎中的内存管理是一个非常具体的主题,尤其是当您想让引擎易于使用时。如果您看一下 Unreal Engine 4,他们通过生成反射代码在内存管理方法方面走得更远。一般来说,无需显式调用 retain
或 release
就可以创建 cocos2d-x 游戏。这些方法首先在您需要手动延长对象的生命周期以避免删除它并再次创建它(缓存)时使用。
共享指针会使语法复杂得多,并且会给动态转换和绑定指针作为参数带来额外的困难。更重要的是,您必须使用 weak_ptr 和 shared 以避免交叉引用,这也需要额外的努力。
基本上 shared_ptr 是一种类似于 intrusive_ptr 的引用计数技术,可以更自然地集成到 cocos2d-x 中。而cocos中的addChild
/removeChild
等函数是子对象的递增和递减计数器,所以这些范式并不像乍看起来那么多样化。
出于任何技术原因,我不认为 Cocos2d-x 使用 Objective-C 范例管理 Ref
派生对象。 c++ 智能指针(或 "regular object allocation")即使不是更好,也可能同样有效。
然而,从历史上看,Cocos2d-x 是 Cocos2d 项目的一个 c++ 端口——它是原生的 Objective-C(iirc,它是早期 Python 基于游戏引擎)。所以使用 AutoReleasePool、'retain' 和 'release' 方法是历史性的。
现在更改它会破坏很多代码并惹恼很多开发人员,目的是什么? c++ stl 的稍微更地道的用法?
重要的是 Ref
对象的管理很容易,可以说比教开发人员用正确的 *_ptr<> 包装东西要容易得多,并且允许 Cocos2d-x项目 - 通过隐藏大部分内存管理 - 以保持与 Cocos2d-js 的功能对等。 (我认为还有一种尝试保持 api 与 Cocos2d 的兼容性)。
当我最近开始在 Cocos2d 中开发时,我发现的第一个非常奇特的功能是 Objective-C 样式的自动释放池内存模型。在我使用 c++ 的所有经验中,我避免使用任何形式的动态内存分配,除非绝对必要(这实际上非常罕见)。
起初,我很困惑为什么 Cocos2D 没有利用更安全的替代方法来创建指针对象(例如智能指针),但后来我遇到了 this 线程,它讨论了shared_ptr<class T>
(其中最重要的是速度)相对于当前内存范例的手动保留/释放方法的缺点。
然后我想,"why not simply allocate an object regularly and pass and store its reference when necessary?"我明白将Cocos2d-x的整个记忆系统移植到一个新的范式是非常耗时的,但在漫长的运行使用更稳定的惯用 C++ 代码不值得吗?
归根结底,与常规对象分配相比,当前内存模型的优势是什么?
游戏引擎中的内存管理是一个非常具体的主题,尤其是当您想让引擎易于使用时。如果您看一下 Unreal Engine 4,他们通过生成反射代码在内存管理方法方面走得更远。一般来说,无需显式调用 retain
或 release
就可以创建 cocos2d-x 游戏。这些方法首先在您需要手动延长对象的生命周期以避免删除它并再次创建它(缓存)时使用。
共享指针会使语法复杂得多,并且会给动态转换和绑定指针作为参数带来额外的困难。更重要的是,您必须使用 weak_ptr 和 shared 以避免交叉引用,这也需要额外的努力。
基本上 shared_ptr 是一种类似于 intrusive_ptr 的引用计数技术,可以更自然地集成到 cocos2d-x 中。而cocos中的addChild
/removeChild
等函数是子对象的递增和递减计数器,所以这些范式并不像乍看起来那么多样化。
出于任何技术原因,我不认为 Cocos2d-x 使用 Objective-C 范例管理 Ref
派生对象。 c++ 智能指针(或 "regular object allocation")即使不是更好,也可能同样有效。
然而,从历史上看,Cocos2d-x 是 Cocos2d 项目的一个 c++ 端口——它是原生的 Objective-C(iirc,它是早期 Python 基于游戏引擎)。所以使用 AutoReleasePool、'retain' 和 'release' 方法是历史性的。
现在更改它会破坏很多代码并惹恼很多开发人员,目的是什么? c++ stl 的稍微更地道的用法?
重要的是 Ref
对象的管理很容易,可以说比教开发人员用正确的 *_ptr<> 包装东西要容易得多,并且允许 Cocos2d-x项目 - 通过隐藏大部分内存管理 - 以保持与 Cocos2d-js 的功能对等。 (我认为还有一种尝试保持 api 与 Cocos2d 的兼容性)。