cocos2dx内存管理解析,cocos2dx内存管理

  次阅读 来源:互联网(转载协议) 2015-09-28 13:16 我要评论(0)

cocos2dx内存管理解析,cocos2dx内存管理

今天第一天开始写博客,我想我也会一直的坚持坚持下去,和所有人进行分享和交流,这也是源于对技术的热爱和对游戏的炽热,我想我的这一生都将会奉献给游戏,他是我一辈子的事业更是我这辈子的朋友,好了废话就不多说了,第一篇博客我们就来聊聊cocos2dx的内存管理。

我们首先来看下下面的代码片段

class Ref

{

public:

void retain();

void release();

Ref* autorelease();

protected:

unsigned int _referenceCount;

};

而看cocos2dx里面所有的显示对象的基类Node也都公有的继承了Ref(在cocos2dx3.0以下是CCObiect),于是所有的显示对象也都有具有这三个方法,而在看看这三个方法的实现

void Ref::retain()

{

CCASSERT(_referenceCount > 0, "reference count should greater than 0");

++_referenceCount;

}

void Ref::release()

{

CCASSERT(_referenceCount > 0, "reference count should greater than 0");

--_referenceCount;

if (_referenceCount == 0)

{

#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)

auto poolManager = PoolManager::getInstance();

if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this))

{

CCASSERT(false, "The reference shouldn't be 0 because it autoreleasepool.");

}

delete this;

}

}

Ref* Ref::autorelease()

{

PoolManager::getInstance()->getCurrentPool()->addObject(this);

return this;

}

了解object-c的人通过上面的代码应该都能够明白cocos2dx-c的内存管理其实是和object-c的一模一样的,都是采用引用计数的方法来管理自己的内存的,当创建一个对象的时候他的引用计数器_referenceCount会加一,不要问我为什么,因为_referenceCount在构造函数被初始化了1,在看下面创建一个显示对象的代码

Layer *Layer::create()

{

Layer *ret = new (std::nothrow) Layer();

if (ret && ret->init())

{

ret->autorelease();

return ret;

}

else

{

CC_SAFE_DELETE(ret);

return nullptr;

}

}

这是创建一个层的代码new Layer 这个对象的内存快,init初始化这个类里面的逻辑函数或者变量,然后autorelease然后返回,为什么要autorelease呢,看看autorelease这个函数的实现

Ref* Ref::autorelease()

{

PoolManager::getInstance()->getCurrentPool()->addObject(this);

return this;

}

原来是把这个对象也就是这个内存快添加到一个全局的PoolManager里面,而为什么要添加到PoolManager这里面呢,看看PoolManager就一目了然

AutoreleasePool* PoolManager::getCurrentPool() const

{

return _releasePoolStack.back();

}

是获取得到一个 PoolManager 里面AutoreleasePool对象,并且把显示对象添加到AutoreleasePool对象里面的集合对象中(此处我也不太明白作者的用意,单利对象本来就只有一个实例,为毛_releasePoolStack还是一个集合,每次都要拿集合最后的一个AutoreleasePool,而框架由始至终都只往_releasePoolStack集合中添加了一AutoreleasePool对象);这样只要经过autorelease的函数就会添加到PoolManager里面来,而为什么要这样做呢,当然肯定是为了更好的管理内存,而在什么地方管理呢,我们知道cocos2d他只有一个主线程,在那呢,我们找找

void DisplayLinkDirector::mainLoop()

{

if (_purgeDirectorInNextLoop)

{

_purgeDirectorInNextLoop = false;

purgeDirector();

}

else if (! _invalid)

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...