Cocos2d-x内存管理
Cocos2d-x内存管理浅解 1、首先我们知道内存管理分为c++自身管理机制以及Cocos2d-x内存管理机制。在c++中,内存分为堆区、栈区、静态存储区(全局存储区)、常量存储区、自由存储区。 主要先说一下堆区和栈区。堆区主要由new和malloc分配,new与delete,malloc与free成对出现,保证内存的分配与回收。堆内存分配地址是逐渐增大的,这一点与栈区相反,我们都知道栈是先进后出,所以栈的存储方向是内存地址逐渐减小的。栈中的内存也是系统自动回收的,这个我们不需要考虑自己管理内存泄露的问题,而堆区的释放一定要注意使用完后手动释放,不然就会出现内存泄露的问题。在小的程序中我们可能感受不到这个问题的严重性,在成品软件中我们必须要严防这个问题,很多时候在PC端开发的时候没有感觉到任何问题,但是版本发布后就会发现出现很多Crash,这个其中很重要的原因就是因为内存泄露。我们经常说手机内存的大小,当手机装了一大堆软件之后就会变得非常卡,就是这个原因,内存泄露之后正在运行的程序越来越感觉内存不够用,严重的就是不断卡顿然后Crash。所以要养成习惯,注意内存使用与回收的问题。 另外关于静态存储区的问题,我们需要注意几点,静态函数与静态成员变量是类所拥有的不是某个对象所独有的,静态成员可以由类名调用,统一赋值或改变,这是静态成员的优点同样也是缺点,当我们需要一个全局变量时我们一般会使用静态变量,使用十分方便但是当不同的对象需要对其改变而其他对象不需要时则会发生数据不稳定的情况,这是我们不愿意看到的。对于其优点我们一般在需要全局出现的地方使用,例如单例模式中,我们需要一个单例类,单例类对象的初始化函数就是静态成员,表明全局性,而我们知道静态函数只能操作静态数据,所以我们的成员指针也必须是静态的。这样我们就实现了对象的唯一性。 cocos2d-x内存管理总的原则是谁拥有 , 谁管理 , 谁释放。 cocos2d-x使用引用计数对内存进行管理。当我们在堆上分配一块内存空间的时候,这个对象的引用计数就是1,当有对象要引用这块内存空间的时候,这个引用计数就增加1,当有对象不再引用这块内存的时候引用计数就减1,当这个引用计数减为0的时候就使用delete删除掉这块内存,这样就做到了当有对象引用的时候会正常的访问这块内存,引用完毕也可以正常的回收。但是如果每一个对象全部是手动retain和release,那么我们的代码里就会到处都是retain、release,既不美观方便也容易出错,于是我们引入了自动内存管理池对对象进行管理。看如下代码,引用计数问题就会比较清楚了。 //对象创建的时候引用计数被设置为1,这个是在它的构造函数中完成的,它会先调用父类CCOjbect的构造函数 有兴趣的同学可以看引擎的源编,在源码中我们看到CCObject做的工作比较简单,它主要就是有两个功能。一个是通过引用计数交给内存管理器进行内存管理。另一个就是通过脚本ID访问相应的脚本。脚本的分析暂时不探讨,我们暂时只把内存管理的事情搞明白。我们来重点看一下autorelease函数的意义,顾名思义,“自动释放”。也就是说调用此函数则当前CCObject实例对象不需要用户在外部去手动调用release进行内存的释放工作。我们上面已经知道它通过引用计数来处理在什么时候内存释放,那么Cocos2d-x是怎么做到的? 在autorelease函数中有这么一句:CCPoolManager::sharedPoolManager()->addObject(this); CCPoolManager代表了内存管理器。此句调用CCPoolManager的实例对象的addObject函数将当前CCObject实例对象的指针交给内存管理器,内存管理器负责管理CCAutoReleasePool,CCAutoReleasePool中加入的就是被自动管理的对象。 下面来看一下内存管理器的原理: CCMutableArray是一个CCObject指针容器类,它内部通过使用STL的vector容器来存储CCObject指针。在加入一个新CCObject时对其引用计数器加1,在移除CCObject时对其引用计数器减1。有兴趣的同学可以自行打开CCMutableArray.h及cpp文件进行查看。 那么上面的介绍大家应该已经有了一个比较清楚的了解了, 最后再总结一下:Cocos2d-x提供了一个内存管理器类CCPoolManager,它有一个容器,而这个容器是用来存放了一些容器管理类CCAutoreleasePool的实例对象的。需要自动进行内存释放的CCObject实例对象会把其指针存放在容器管理类CCAutoreleasePool的实例对象中的m_pManagedObjectArray容器里。所有存在其中的CCObject实例对象在进行释放操作时通过使用计数器来进行判断在何时真正delete内存。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |