cocos2d-x核心类剖析-cocos2d-x内存管理机制

12 篇文章 0 订阅

3cocos2d-x内存管理机制

目标:搞清楚coco2d-x内存机制是如何管理精灵内存资源。

1、内存管理机制的基本概念及应用

1、 基础知识

cocos2dx采用的是引用计数的方式来管理对象的持有和释放。

所谓引用计数就是说,每个对象都会有一个属性用来记录当前被几个地方引用了。在释放内存的时候会根据这个引用计数来确定是否要用delete操作符来释放这个对象占用的内存。具体见CCObeject的默认构造函数,retainrelease方法。

2实验:helloworld项目中

helloworld.h中声明一个CCSprite *pSprite成员变量 

1) helloworld类的

bool HelloWorld::init()

{

… … //省略代码

//创建一个精灵,

pSprite = CCSprite::create("CloseSelected.png");

pSprite->setPosition(ccp(200, 200));

//this->addChild(pSprite, 0, 99); 注意不addChild

  … … //省略代码

  return true;

}

 

void HelloWorld::menuCloseCallback(CCObject* pSender)

{

CCLOG("getPosition begin");

CCPoint point = pSprite->getPosition();

CCLOG("getPosition end");

… … //省略代码

}

单击关闭按钮,程序会coredump

3分析原因:

1) 加上这一句再做实验,程序正常,this->addChild(pSprite, 0, 99); 

结论:

1addChild函数认领了对象。让对象交给cocos2d-x内存管理机制去管理。

2addchild函数里面调用了retain()方法,让对象引用次数+1;垃圾回收时,再-1,不会是零,所以精灵对象不会被delete

内存管理机制的应用 

应用层面结论:

1) Retain()函数:将引用计数加1

2) Release()函数:将引用计数减1,如果引用计数为0delete本对象。

3) autorelease()函数,将本对象加入内存管理池中,并将对象引用计数m_uReference1m_uAutoReleaseCount1.

 

2、内存管理机制的深入理解

内存管理对象有两种方法:手工申请、手工释放;交给cocos2d-x内存管理机制

问题1new一个从CCObject类继承的对象发生了什么?

 

结论:m_uReference=1m_uAutoReleaseCount=0

 

问题2:手工创建object对象后,object析构函数做了什么?

测试:HelloWorld项目中,运行run1函数

结论:手工管理,手工释放

问题3:把对象执行autorelease函数,交给cocos2d-x内存管理机制,cocos2d-x做了什么?

 

分析如下:

问题3:为什么创建精灵以后不用释放,没有被删除?

 

 

 

 

问题4:精灵什么时候被删除

 

大家也参考《cocos2d-x高级开发教程》2.3.3节,书中介绍了CCPoolManager管理、CCAutoreleasePool的方法。篇幅原因,暂不赘述。

结论:

1) AddChild函数做了reatain操作保证了,保证精灵不会被垃圾器删除

2) 我们创建了精灵对象、或者CCObject对象,如果进行了autorelease操作,如果没有把这个节点添加到父节点(形象比喻:没有认领的话,),若跨多帧保存精灵对象,需要执行retain操作。

3) 对于精灵这样的节点对象,建议使用cocos2d-x内存管理机制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值