您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 内存管理理解 总结

2013-04-21 17:34 267 查看
本文将主要进行对现在流行的cocos2d-x引擎的内存管理机制,进行一些总结,由于是刚刚接触cocos2d,并且本文是自己的整个cocos2d内存管理的自我的理解,难免有错,请各位看官斧正或交流,一起提高。

本文将不在进行跟踪源码了,因为网上已经有很多相关的分析,比如Cocos2d-x内存管理都是不错的讲解。

我将通过下面三个过程,进行说明我的理解

对象新建和调用autorelease()的对象内部变化
而后是当我们调用autorelease后,系统在背地里做了什么
我对于使用autorelease(),restain()的使用方式的理解

一:调用autorelease()函数

一般我们调用autorelease的情况都是
CCSprite * p = new CCSprite();
p->autorelease();
是不?上面这段代码第一句代码干了什么的干活?首先是通过新建对象CCSprite,父类CCObject的初始化将该对象的m_reference赋值为1。而后调用autorelease()函数就会将这个对象加入到AutoReleasePool这个数组中存放起来,并且将CCSprite的m_autoreleasecount(自动释放次数)
加1.

二:系统鬼鬼祟祟做什么?

当我们调用了autorelease()函数之后,系统背地里帮我干了什么?其实当你看过源码之后,你会知道在Director类中的主循环函数main_loop().函数中有一句话

// release the objects
CCPoolManager::sharedPoolManager()->pop();
表示在每执行一帧之后,Director都会将AutoReleasePool的数据清空,让pool中的元素调用release方法。这样就将我们不需要的元素给释放掉了。

三:对于使用autorelease(), retain(), release()函数使用情况的理解

对于这个的理解,我觉的:
release():这个函数很简单,就是首先判定对象的m_reference是否为1,如果为1,那么将其delete掉。

autorelease()的使用情况,就是在我们创建了一个对象,对于这个对象我们不需要知道它什么时候消亡,因为我在其他地方都不会使用它(所以我觉得,如果已经知道以后不会再使用它了,直接进行release就行了,但是系统给我们提供了,这个方法,不要我们去手动的调用release函数)

retain():对于这个函数就只有在,我们创建完之后调用了autorelease函数才有。通过autorelease函数我们知道,当Director在main_loop中清空所有autoreleasePool中加入的对象的时候,调用的release函数,所以当我们函数m_referce==1,则该对象会被delete掉。那么我们要怎样避免对象被系统,悄悄的释放掉。我们就要显示的修改m_reference让它们大于1。这样系统执行autoreleasePool清空的时候,只是将release--;

因为我也是刚刚接触有什么错误的确实不能避免,希望给我能够给我指出,共同学习进步啊,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: