首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

Cocos2d-x 内存储器管理剖析(1)

2013-10-08 
Cocos2d-x内存管理剖析(1)下面这篇文章将深入cocos2dx引擎的源代码,剖析cocos2dx中内存的管理机制的实现。

Cocos2d-x 内存管理剖析(1)

下面这篇文章将深入cocos2dx引擎的源代码,剖析cocos2dx中内存的管理机制的实现。使用cocos2dx-2.1.5版本。

参考文章:点击打开链接 

一、前言:

我们都知道在c++中,创建实例化的对象都是使用new关键字,在不使用或者不需要的时候必须手动使用delete关键字去掉这个对象,否则new出来的对象就不能回收,造成内存泄露。


例如(我们创建了一个大小为10的数组)

->addObject(pObject); 将被管理对象添加到自动管理池中的过程中(将对象添加到数组中),其会对对象进行retain的,所以 m_uReference 就变成了 m_uReference=2。


下面跟踪一下这个过程:

retain(); 了吧!


③所以最后的release是为了将引用计数重新变成为1。这样的话,从对象创建,到被放到对象自动管理池,引用计数依然为1,被管理值也为1(表征对象是自动管理)。



下面看看 CCPoolManager 类,这个类顾名思义就知道是对对象自动释放池进行管理的类,它是一个单例类。

void CCPoolManager::push(){    CCAutoreleasePool* pPool = new CCAutoreleasePool();       //ref = 1    m_pCurReleasePool = pPool;    m_pReleasePoolStack->addObject(pPool);                   //ref = 2    pPool->release();                                       //ref = 1}

如代码所示,push()操作 new 了一个自动释放池对象,并且将它赋值给 当前自动释放池(m_pCurReleasePool),然后将这个new的自动释放池对象放到CCPoolManager 里面的自动释放池数组中。


注意过程中对其引用计数的控制,自动释放池本身也是继承ccobject的,也有自己的引用计数,受相同的内存管理方式。其中的注释就表明了自动释放池对象的引用计数。


好,大致已经介绍了CCPoolManager 和 CCAutoreleasePool 这两个类,那么再来看将对象自动管理autorelease的过程就比较简单了。


首先调用构造方法,new一个对象(我们称之为object),然后这个对象调用autorelease方法,接着就是得到

CCPoolManager的单例变量,用getCurReleasePool() 方法获取到当前的对象自动释放池对象(如果没有的话,就新建一个对象自动释放池对象,并且添加到 对象自动释放池数组中),然后把这个object对象添加到自动释放池中的


Cocos2d-x  内存储器管理剖析(1)

2、对对象进行autorelease操作

Cocos2d-x  内存储器管理剖析(1)


Cocos2d-x  内存储器管理剖析(1)


3、对对象进行retain操作:

Cocos2d-x  内存储器管理剖析(1)


Cocos2d-x  内存储器管理剖析(1)






热点排行