寒風的Cocos之旅之C++篇--cocos2d-x内存管理机制

前端之家收集整理的这篇文章主要介绍了寒風的Cocos之旅之C++篇--cocos2d-x内存管理机制前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

目前主要有两种实现智能管理内存的技术,一种是引用计数,一种是垃圾回收。Cocos2d-x采用的是引用计数机制。为此实现了自己的根类CCObject,每个对象都包含了一个用来控制生命周期的引用计数器,就是CCObject的成员变量m_uReference。

  对于m_uReference,构造函数创建时对该引用计数器赋值为1(自引用,并没有实际的使用),当需要引用对象时调用retain()方法增1,当引用结束的时候调用release()方法减一。而autorelease()方法(create工厂方法迫切需要)会将对象放入自动回收池(CCAutoReleasePool)实现灵活的垃圾回收。当每一帧结束的时候,自动回收池中的对象都会被执行一次release()

autorelease()方法里面代码将该对象添加自动释放池中:CCPoolManager::sharedPoolManager()->addObject(this);

create方法将对象加入内存池后,对象的所有权已经属于内存池了,我们返回的指针其实是没有所有权的.主循环mainloop干了件非常重要的事情,那就是pop最上层的autorelease pool,此时是在release全部仅仅由此内存池所有的对象. 就是依靠这样的原理,我们可以放心的将对象放在autorelease pool中,知道在需要的时候,这个对象就能正确的释放,同时只要有上层的父节点通过addChild对游戏对象有了所有权以后,又能正确的保证该对象不会被删除.

如果在一帧之内生成了大量的autorelease对象,将会导致回收池性能下降。因此,在生成autorelease对象密集的区域(通常循环中)的前后,我们最好可以手动创建并释放一个回收池。CCAut0m_pReleasePoolStack

CCPoolManager::sharePoolManage()->push()

for(){}

CCPoolManager::sharePoolManage()->pop()

CCAutoreleasePool

原文链接:https://www.f2er.com/cocos2dx/341159.html

猜你在找的Cocos2d-x相关文章