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对象,始终使用自动变量。

你可能感兴趣的:(Cocos2d-x 内存管理机制)