Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
来源:互联网 发布:什么软件找工作最好 编辑:程序博客网 时间:2024/05/16 19:06
原文地址:http://blog.csdn.net/a7833756/article/details/7632199
前一篇我们讲到cocos2d-x里的内存管理机制,以及引擎中的自动内存管理机制。一个被自动管理的对象从new出来之后到被放到autoreleasepool那么接下来,对象是如何被引擎自动delete掉的呢?首先我们要知道,cocos2d-x的引擎线程是单线程的,它不停的调用voidCCDisplayLinkDirector::mainLoop(void)来绘制当前的Scene ,同时对一些自动释放的对象进行管理。我们先到一个cocos2d-x项目的main()函数里面:
这里调用了一个run()方法,我们跟踪进去:
Run方法有个while(1)循环,不断的调用mainLoop(void)方法,来完成界面渲染和对象释放,我们进mainLoop():
于是我们看到了引擎对自动管理的对象进行释放的操作。它调用的,是CCPoolManager的pop()方法,我们去看看这个pop()方法:
如代码里面所示,m_pReleasePoolStack就是之前提到的当前内存池,也就是内存池管理者里面那个内存池堆栈的栈顶的那个内存池,对其进行clear()操作,记住,在clear()之前,被放置在自动管理池内的对象的引用次数都是为1的(依然只考虑对象被new出来之后马上autorelease()操作并且在其他地方不进行retain()),那么进行clear()操作时:
CCAutoreleasePool会做这样两件事情,首先会把池中所有对象的被管理状态置为false,表示对象已经不再处于自动管理状态,然后清除管理池中所有的对象引用:
在这一过程中,会调用每个对象的release()方法,这样,我们算一下,之前对象的引用次数为1,那么在这里进行一次release之后,引用为0,就会执行delete操作,这样一来,这个被管理的对象就被成功释放掉了。
下面我们来写个小demo验证一下这个过程:
New一个对象:
s的引用次数为1,被管理状态为false:
对其进行autorelease()
s的引用依然为1,被管理状态为true:
然后进行一次retain()操作:
引用变为2
接下来刷下一帧,刷完后我们再看o对象,发现其被管理状态变为false,引用变成1了,这说明如果我们之前没有手动执行过retain(),这个对象已经被引擎给回收掉了。
这样一来,验证了引擎的自动回收机制,我们可以在retain()后面release()一次,来看看对象o被delete后的状态:
发现其内部的数据都变成随机数值了,也就是对象已经被清除了。
最后我来做个简单的总结:
Cocos2d-x中,采用引用计数的方式进行内存管理,谁需要引用这个对象,就对其retain()一次,同时在不需要它的时候,就要对其进行release()操作,这一点在引擎很多地方有示例,例如CCNode进行addchild()操作时,会对child进行retain()表示对其引用:
而在removeChild()的时候会对其进行release()操作
第二点是对象的autorelease()操作,该操作的效果是对象在当前这一帧被new出来之后,在下一帧之前没有被执行retain()(例如被add到某个CCMutableArray,或者被一个父Node作为子节点,也可以是我们手动retain()),那么这个对象在下一帧就会被引擎给delete掉,那么有时候出现的空指针错误,可能就来源于此。还有的时候,是在自己手动retain()后放入autorelease池,这样引擎只能将对象的引用减一,而不能delete掉,从而造成内存泄露。最后说一下,本人也是刚开始学习c++和cocos2d-x,写这篇博客与大家分享一下自己的心得,也是希望能帮到一部分对cocos2d内存管理有困惑的朋友,让大家能共同学习进步,同时对我所讲到的不合理的地方,希望各位大牛能够指出,感谢阅读!
- Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
- [置顶] Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
- Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
- Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
- Cocos2d-x学习(二十六):cocos2d旋转矩阵推导
- Cocos2d-x内存管理(二)
- Cocos2d-x内存管理(二)
- Cocos2d-x内存管理(二)
- Cocos2d-x内存管理(二)
- Cocos2d-x内存管理(二)
- cocos2d-x 内存管理二
- cocos2d-x 内存管理二
- Cocos2d-x学习(十五):Cocos2d-x内存管理(一)
- [置顶] Cocos2d-x学习(十五):Cocos2d-x内存管理(一)
- Cocos2d-x学习(十五):Cocos2d-x内存管理(一)
- Cocos2d-x学习(十五):Cocos2d-x内存管理(一)
- Cocos2d-x学习笔记(十一)-------->Cocos2d-x的内存管理
- Cocos2d-x学习(二十一):cocos2d-x引擎结构
- linux中ls -l文件类型权限
- Cocos2d-x学习(十五):Cocos2d-x内存管理(一)
- 在web网页中打开word文档
- 在Neoaxis界面中显示中文
- rac安装失败或者是想重新安装,在现有的机器上应该清除哪些东西!
- Cocos2d-x学习(十六):Cocos2d-x内存管理(二)
- ER-Studio的五种关系说明
- HOJ 2760 Integration Problem
- LDO低压差线性稳压器
- DBCC使用之:使用DBCC来探索ASE中的索引页及数据页结构
- vim 替换操作大全
- PHP 计算页面执行时间
- Adapter的作用就是ListView界面与数据之间的桥梁
- VC++获得当前系统时间的几种方案