首页 > 其他 > 详细

Cocos2d-x内存管理解析

时间:2014-03-21 06:45:18      阅读:400      评论:0      收藏:0      [点我收藏+]

1、cocos2d-x具有自己的内存管理机制,这是可选的,我们可以选择使用,也可以选择不使用。

2、所有的cocos类都继承自CCObject,它维持了一个引用计数_reference,内存管理就是通过这个引用计数来实现的。对象创建的时候,这个计数默认是1.操作_reference有retain()和release(),retain将计数+1,release将计数-1,release调用时会检查,如果-1后计数为0,就会删除该类。

3、cocos2d维持一个AutoReleasePool栈,这个栈里面保存着新加入到内存管理里面的对象。

4、现在来看我们如何做内存管理。如果是你自己new出来的东西,你当然可以直接delete掉。

  但是,如果是你通过CCObject的静态函数create得到的对象,就要小心了。create的时候,会自动帮你把对象加入的最近的AutoReleasePool(多个AutoReleasePool组成了一个栈,你只能加到栈顶的AutoReleasePool中)。这种情况下就不需要你手动delete,AutoReleasePool会帮你delete掉。

  AutoReleasePool是如何运作的呢?每一帧结束的时候,AutoRelease栈都会pop出一个AutoReleasePool(你create出的对象就在里面),这个Pool会将已加入的所有对象都执行release,这时候如果你创建对象以后就没管过它(没有调用过retain,计数保持在默认的1)或者计数为1,那它在调用release后就自己删掉了。这就是自动删除的原理。AutoReleasePool被弹出且执行了所有对象一次Release后,就不再管事了。那么如果我retain过对象,AutoReleasePool不就删不掉了,那该对象如何释放呢?你需要显示release的时候释放,retain和release应该成对出现.

  所以,如果你不想你的对象自动销毁,你就应该retain它,然后在你自己不需要的时候release

5、AutoReleasePool栈每一帧都会pop出一个AutoReleasePool,新加入的对象是加入的栈顶的AutoReleasePool,如果栈是空的,会创建一个。

  如果我们担心AutoReleasePool对象太多压力比较大,对于我们需要马上释放的东西,我们可以先自己push一个AutoReleasePool,然后执行一段代码,然后pop,这样那一段代码中的对象就会立刻执行release,不会将对象堆积在帧结束的时候的AutoReleasePool中。

Cocos2d-x内存管理解析,布布扣,bubuko.com

Cocos2d-x内存管理解析

原文:http://www.cnblogs.com/icanmey/p/3614357.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!