cocos2d-x内存管理机制

来源:互联网 发布:阿里云的机房 编辑:程序博客网 时间:2024/04/30 22:27

关于cocos2d-x的内存管理,YxSimple已经在其博文你应该知道的cocos2d-x 内存管理中做了比较详细的阐述,这里我仅做些进一步的探讨。

CCAutoReleasePool的作用

在讨论cocos2d-x的内存回收机制之前,先讨论一下对象内存回收的时机。对于一个对象(或称之为变量,以下对这两个词不做区分),其内存回收的时间可能存在于以下几个时机:

  • 出了作用域后立即回收:如局部变量。
  • 没有其它对象(强)引用时回收:这种机制的思想是,对于对象obj,当没有其它对象引用时,那么obj所占内存(资源)就应该得到回收。
  • 隔一段时间统一回收:使用了垃圾回收机制,这里会涉及到一个内存池的概念。
  • 进程退出的时候回收:给进程分配的内存在进程退出的时候都能得到回收。

对于第一种方式,对象在出了作用域后就不能再用了;对于最后一种方式,对象一直占用着内存,对资源的利用率太低。

第二种方式可以手动实现,也可以自动实现。手动实现的典型用法就是C++将对象A先new出来,作为另一个对象B的成员变量,当B销毁(delete)时就顺便把A也销毁。C中的对应版本是malloc/free。使用这种方式,很容易造成内存泄漏。自动实现的典型方式是智能指针。它的好处是程序编写者不需要再关心某对象何时被销毁,也能够放心地确保内存能够在适当的时候被合理地回收。智能指针现在主要有两个实现,一个是boost::Smart_Ptr,另一个是C++0x::memory中的实现。

对于第三种方式,是JVM的内存管理方式。

言归正传,在这么多回收机制中,cocos2d-x使用了哪一种机制呢?答案是,它使用了第三种方式,但是它并没有像JVM那样使用垃圾回收,因为它的内存池只是保存了一个指针(引用)。当对象创建好后,它可以被放到内存池(CCAutoReleasePool)中,这个内存池保证这个对象可以至少有一帧间隔的生存时间,而且也只对加入其中的对象管理一帧间隔那么长时间,过了这个时间它就不再管理了。这个有点像“寄存”,即一个对象创建好后,可以在内存池中寄存一帧间隔时间。关于为什么只有一帧间隔时间,参考你应该知道的cocos2d-x 内存管理中的分析。

这样做有什么好处?不用的内存能够得到及时的释放。(需要补充其它好处)

另外,关于cocos2d-x和cocos2d中的内存管理方式还有点不同,具体请参考Memory Management in Cocos2d-x。

CCObject中retain/release的作用

虽然CCObject使用了引用计数,但是没有这个引用计数并没有发挥很强大的作用,仅仅是在被内存池管理的那一帧间隔时间内起了作用,其它时间都仅仅相当于new/delete,远没有智能指针来得方便。如果是对象指针(引用)没有在内存池中,那么应用程序编写者就需要手动来管理引用计数了,这个手动管理new和delete工作量没有多大差别。

原创粉丝点击