cocos2dx中的内存管理机制

cocos2dx源自于cocos2d,所以cocos2dx 的内存管理机制沿用cocos2d 的OC内存管理机制,基本原理是对象内存引用计数。
引用计数段m_uReference,retainCount()返回m_uReference的值。

  • 当一个object被new出来时,m_uReference = 1;(父类Ref的构造函数中把引用计数初始化为1)
  • 当调用该object的retain方法时,m_uReference++;
  • 当调用该object的release方法时,m_uReference–,若m_uReference减后为0,则delete该object。

一般我们通过工厂模式create创建对象,在init后调用autorelease;autorelease最终调用PoolManager内存管理池和AutoreleasePool自动释放管理池的addObject方法,把新建对象object添加到m_pManagedObjectArray数组,然后将对象的自动管理变量++,m_uAutoReleaseCount变成1,表明该对象为自动管理对象。addObject该object,m_pManagedObjectArray->addObject(pObject),会对对象进行retain操作,所以最后的release是为了将引用计数重新变为1。这样,从对象创建,到被放到对象自动管理池,object的引用计数依然为1,被管理值也为1。
cocos2dx是使用单线程来绘制场景,它通过不断地调用mainLoop方法来绘制当前的scene,同时对一些自动释放的对象进行管理。
一个对象在刚创建时,自动释放管理池保持对该对象的引用,使得其引用计数为1。
在帧过度时,游戏主循环中的PoolManager::getInstance()->pop();方法调用一次,释放内存管理池(对象在调用autorelease方法后,将对象放进内存管理池中),将自动释放管理池中的对象都release一次,引用计数就会减1,如果引用计数为0,就会立即delete对象。
为了保持该对象不被释放,必须要有管理对象来使用该对象,即管理对象对该对象保持引用。
add..类型的方法会调用对象的retain方法,remove..类型的方法会调用对象的release方法,父节点析构时也会调用子节点的release方法。
所以自动回收机制autorelease就是将new出来的对象的引用计数1在下一帧的时候减掉,帧过度时如果没有管理对象对该对象保持引用(即使用该对象),说明该对象不被需要,就释放掉这个垃圾内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值