美文网首页
Cocos2d-x 内存管理机制

Cocos2d-x 内存管理机制

作者: 曾令伟 | 来源:发表于2016-04-22 17:24 被阅读341次

    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 内存管理机制

          本文链接:https://www.haomeiwen.com/subject/icrxrttx.html