Cocos2dx3.10引擎的底层及内存管理机制

来源:互联网 发布:mysql 锁表后能读吗 编辑:程序博客网 时间:2024/06/08 04:41

思考一个问题: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 : 增加计数
     release : 减少计数
     autorelease : 将一个对象交给自动释放池AutoreleasePool进行管理,由AutoreleasePool负责调用release函数

 图片

图片

 图片
 图片
 图片


 图片
图片 
图片 图片
图片 
图片 
图片 
图片 
图片 图片
图片 
图片 
图片 
图片 
图片 
图片 
图片 
图片 图片
图片 
图片 
图片 
图片 
图片 图片