cocos2dx 的内存管理机制

从c++的方面考虑,目前c++没有完整的垃圾回收机制,cocos2dx中的内存管理机制可以看成是基于智能指针的一个变体,但是同时也可以像使用垃圾回收机制那样,不需要声明智能指针。由于cocos2dx是从iphone中抽离出来的,所以很多东西和oc很像,就当作复习oc吧;

1.引用计数

cocos2dx的所有的对象几乎都继承自Ref基类,它的作用主要就是对对象进行计数的管理;

当一个对象使用由new操作符分配的内存时,其引用技术为1,调用retain()方法时,可以增加其引用计数,调用release()则会减少其引用计数,release()方法会在其引用计数为0的时候自动调用delete运算符删除对象并且释放内存;(retain和release的方法只是去记录一个对象被引用的次数)。注意,当忘记调用release方法的时候,就会导致内存的泄漏;

2.用autorelease方法声明一个智能指针

自动释放(autorelease)是一种延迟释放机制,这样保证局部堆上的变量能够被外部正常使用;

cocos2dx使用autorelease方法去声明一个对象指针为智能指针,但是这些智能指针并不单独关联某个自动变量,而是全部被加入一个autoreleasePool中,在每一帧结束的时候对加入autoreleasePool中的对象进行清理,即一个智能指针的生命周期从被创建开始,到当前帧结束时结束;

实现机制:autoreleasePool对池中的每个对象执行一次release操作如果你给一个对象多次发送autorelease消息,那么当自动释放池销毁时,这个对象也会收到同样数目的release消息),假设该对象的引用计数为1,表示其从来没有被使用过,则执行release后引用计数为0,对象将会被释放;

虽然这个很好用,但是也会有缺点:它延缓了对象的释放,在有大量的对象释放时,会占用大量的内存资源,因此你需要避免大量对象的释放,并且,在下面两种情况下,你需要手动建立,并且手动销毁自动释放池:

a.当你在主线程外开启其他的线程时,系统只会在主线程中自动生成并且销毁自动释放池;

b.当你在短时间内制造了大量的自动释放对象时,及时销毁有助于内存资源的高效使用;

3.autoreleasePool 队列

默认的autoreleasePool一帧被清理一次,主要是清理ui元素的,因为ui元素大部分都是添加到ui树中的,会一直占用内存;

cocos通过实现一个autoreleasePool队列来实现智能指针生命周期的自定义,并由poolmanager来管理这个autoreleasePool队列,poolmanager的初始状态默认至少有一个autoreleasePool,我们可以加入自己创建的autoreleasePool对象,将其加入到队列的尾部,但是,如果我们使用new运算符来创建autoreleasePool对象,则需要手动释放!

autoreleasePool在构造函数中将自身指针添加到poolManager的autoreleasePool队列中,并在析构函数中从队列中移除自己;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值