Cocos2d-x 内存管理机制

Cocos2d-x中所有对象几乎都继承自Ref基类,Ref唯一的职责就是对对象进行引用计数管理:

实际的实现机制是AutoreleasePool对池中每个对象执行一次release操作,假设该对象的引用计数为1,表示其从未被使用,则执行release之后引用计数为0,将会被释放。例如创建一个不被使用的Node:

auto node=new Node(); //引用计数为1

node->autorelease(); //加入”智能指针池”

可以预期,在该帧结束的时候node对象将会被自动释放。如果该对象被使用,则:

auto node=new Node(); //引用计数为1

node->autorelease(); //加入”智能指针池”

addChild(node); //引用计数为2

则在该帧结束的时候,AutoreleasePool对其执行一次release操作之后引用计数为1,该对象继承存在。当下次该节点被移除的时候引用计数为0,就会被自动释放。通过这样,就实现了Ref对象的自动内存管理。

Cocos2d-x有一套性能高效且实现精巧的内存管理机制,它本质上是一种“智能指针”的变体。它通过Ref::autorelease来声明一个“智能指针”,并通过将autorelease包装在create方法中,避免了程序员对“智能指针”的声明,默认在一帧结束的时候AutoreleasePool会清理所有的“智能指针对象”,并且我们可以自定义AutoreleasePool的作用域。

结合Cocos2d-x内存管理机制和特点,使用Cocos2d-x内存管理的注意事项:

1. Ref的引用计数并不是线程安全的,在多线程中我们需要处理互斥锁来保证线程安全。在Objective-C中由于AutoreleasePool是语言级别系统实现的,每个线程都有自己的AutoreleasePool队列。

2. 对于自定义Node的子类,为该类添加create方法,该方法返回一个autorelease对象。

3. 对于自动义数据类型,如果需要动态分配内存的,继承自Ref,并添加create静态方法返回autorelease对象。

4. 只在一个方法内部使用的Ref对象,使用自定义的AutoreleasePool来即时清理内存占用。

5. 不要动态分配AutoreleasePool对象,始终使用自动变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Cocos2d-x 的内存管理方法基于 Cocos2d-iPhone 的 Objective-C 风格的内存管理,...
    资深小夏阅读 514评论 0 0
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,483评论 0 3
  • Why? 内存管理一直是个很重要的事情,需要考虑分配和回收的时机,千万不能出现内存泄漏,因为手机上内存本来就有限。...
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,086评论 1 16
  • 内存管理的原理? 内存空间总共有8块区域,有两个区域需要特别注意,一个就是堆空间,一个就是栈空间。栈里存放临时变量...
    Carden阅读 535评论 0 1

友情链接更多精彩内容