思考一个问题:cocos2dx游戏引擎的内存管理机制,为什么不使用C++的Shared_ptr这个看似完美的内存管理方案,而是引擎自身去实现一套机制?
一、引擎启动
每个Cocos2d工程创建完,都会有AppDelegate/HelloWorldScene文件,AppDelegate是cocos2d引擎的入口类,引擎启动时首先会去加载AppDelegate类AppDelegate.h
二、引擎内存管理
◆ Node的管理 : (继承关系,U3D是组成关系),整个引擎的管理关系是树形结构的节点
在Node中,有个指针容器成员m_pChildren,存放了当前节点下的所有子节点,可通过addChild()方法增加子节点,将所有子节点的指针都存放在当前节点的容器中,只需要纵向查询即可,不再需要横向查询了。
◆ 内存管理基本思想:引用计数,跟C++的share_ptr、weak_ptr是俩个概念,处理自动释放的原理具有相似性
通过计数的方式,实现多个不通的对象同时引用一个共享对象;
当创建一个对象的实例并在堆上分配内存时,对象的引用计数为1,(即new出来后,初始计数值是1);在其他对象中需要持有这个共享对象时,需要把共享对象的引用计数加1;当其他对象不再持有该共享对象时,共享对象的引用计数减1;当共享对象的引用计数变为0时,该共享对象的内存会被立即释放。
retain : 增加计数
retain : 增加计数
release : 减少计数
autorelease : 将一个对象交给自动释放池AutoreleasePool进行管理,由AutoreleasePool负责调用release函数