当前位置:编程学习 > wap >>

Cocos2d-x内存管理解说在ios开发中

使用过 Cocos2d-x 都知道,其中有一套自己实现的内存管理机制,不同于一般 C++ 的编写常规,而在使用前,了解其原理是有必要的,网上已经有很多对内部实现详细解说的文章。而对于使用者而言,并不需要对其内部有很深的了解,注重其“机制”,而非内部实现,在这里只是简单的聊一聊它的管理方式以及使用,固为浅说。

 

无用对象 与 管理对象

Cocos2d-x 将会在下一帧自动清理无用的对象,什么是无用的对象,通过 create() 方法创建的就是无用的对象。

 

为了简要说明,代码的组织设计一切从简,我们创建了两个辅助类和一个容器类 BaseLayer,在 BaseLayer 之上管理内部对象,并观察它是怎么自动管理对象的。实现了其 构造函数 方法和 析构函数,并做些日志打印,以方便我们观察:

1.class LSLayer: public CCNode {  2.public:  3.    virtual bool init() {  4.        CCLog("LSLayer().init()");  5.        return true;  6.    };  7.   8.    CREATE_FUNC(LSLayer);  9.   10.    LSLayer(){  11.        CCLog("LSLayer().()");  12.    };  13.    ~LSLayer() {  14.        CCLog("LSLayer().~()");  15.    };  16.};  17.   18.class LSSprite: public CCNode {  19.public:  20.    virtual bool init() {  21.        CCLog("LSSprite().init()");  22.        return true;  23.    };  24.   25.    CREATE_FUNC(LSSprite);  26.   27.    LSSprite(){  28.        CCLog("LSSprite().()");  29.    };  30.    ~LSSprite() {  31.        CCLog("LSSprite().~()");  32.    };  33.};  34.   35.class BaseLayer: public CCLayer {  36.public:  37.    virtual bool init(){  38.        CCLog("BaseLayer().init()");  39.        // 我们创建了两个 “无用”对象  40.        LSLayer* layer = LSLayer::create();  41.        LSSprite* sprite = LSSprite::create();  42.        // 使用了 layer 变为受“管理”的对象  43.        this->addChild(layer);  44.   45.        return true;  46.    };  47.   48.    CREATE_FUNC(BaseLayer);  49.   50.    BaseLayer(){  51.        CCLog("BaseLayer().()");  52.    };  53.    ~BaseLayer(){  54.        CCLog("BaseLayer().~()");  55.    };  56.};  如上所示,我们在 BaseLayer 中创建了两个对象, layer 和 sprite,而只使用了 layer ,如果要运行上面的 BaseLayer 代码,我们需要创建一个 BaseLayer 的层对象,并将它添加到运行的场景或者层中: addChild(BaseLayer::create());,以保证 BaseLayer 开始运行,现在我们分析一下运行的结果:

1.// 由 addChild(BaseLayer::create()); 方法开始,创建并初始化了 BaseLayer 层  2.cocos2d-x debug info [BaseLayer().()]  3.cocos2d-x debug info [BaseLayer().init()]  4.// BaseLayer init 方法我们创建了两个对象  5.cocos2d-x debug info [LSLayer().()]  6.cocos2d-x debug info [LSLayer().init()]  7.cocos2d-x debug info [LSSprite().()]  8.cocos2d-x debug info [LSSprite().init()]  9.// 对象创建完成,紧接着这“无用”对象便已经释放了,而另一个已经使用的对象没有释放  10.cocos2d-x debug info [LSSprite().~()] 通过上面两个例子对比,对 cocos2d-x 的对象管理有了初步的认识,它会自动清理 “无用对象”。为了区分概念,我们将另一种对象称之为 “管理对象”,它是受管理的,有用的对象。比如上文中的 layer。

 

这也算初步认识,当然,这至少解决了我们这样一个疑问:我们在场景初始化的时候,通过 create() 创建了成员变量,以备需要的时候使用,但发现在使用的时候这个对象已经不存在了,从而导致程序崩溃。

 

管理对象不用之时立即回收

我们再继续演变 BaseLayer 的实现,以方便我们观察在每一帧对象的情况,添加实现了定时器功能:

1.class BaseLayer2: public CCLayer {  2.public:  3.    virtual bool init(){  4.        CCLog("BaseLayer2().init()");  5.        // 启用定时器,自动在每一帧调用 update 方法  6.        this->scheduleUpdate();  7.        return true;  8.    };  9.   10.    // 定义 update 统计  11.    int updateCount;  12.    LSLayer* layer;  13.    LSSprite* sprite;  14.   15.    virtual void update(float fDelta){  16.        // 为了方便观察,不让 update 内部无止境的打印下去  17.        if (updateCount < 3){  18.            updateCount ++;  19.            CCLog("update index: %d", updateCount);  20.   21.            // 在不同的帧做相关操作,以便观察  22.            if (updateCount == 1){  23.                layer = LSLayer::create();  24.                this->addChild(layer);  25.                sprite = LSSprite::create();  26.   27.            } else if (updateCount == 2){  28.                this->removeChild(layer, true);  29.   30.            } else if (updateCount == 3){  31.   32.            }  33.   34.            CCLog("update index: %d end", updateCount);  35.        }  36.    };  37.   38.    CREATE_FUNC(BaseLayer2);  39.   40.    BaseLayer2():  41.        updateCount(0),  42.        layer(NULL),  43.        sprite(NULL)  44.    {  45.        CCLog("BaseLayer2().()");  46.    };  47.    ~BaseLayer2(){  48.        CCLog("BaseLayer2().~()");  49.    };  50.};  51.   52.// 打印如下  53.cocos2d-x debug info [BaseLayer2().()]  54.cocos2d-x debug info [BaseLayer2().init()]  55.// 第一帧创建两个对象  56.cocos2d-x debug info [update i

补充:移动开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,