zoukankan      html  css  js  c++  java
  • cocos2d-x内存管理

    Cocos2d-x内存管理

     

     

     

     

     

           老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想

    一.   为什么需要内存管理

    1. new和delete

    2. 堆上申请的内存作用于整个程序,而不是一个两个函数之内

    3. 渲染树和整个游戏循环->引导出内存管理(全局变量,局部变量,和堆上申请的变量比较)

    注:游戏循环:可以看作一种死循环

    1. 绘制
    2. 自动释放池的计数管理

    绘制:包括时间调度,绘制结点等等

    if (_purgeDirectorInNextLoop)

        {

            _purgeDirectorInNextLoop = false;

            purgeDirector();

        }

        else if (_restartDirectorInNextLoop)

        {

            _restartDirectorInNextLoop = false;

            restartDirector();

        }

        else if (! _invalid)

        {

            drawScene();

        

            // release the objects

            PoolManager::getInstance()->getCurrentPool()->clear();

        }

    由上面的内容可以得出:

    1.内存管理并不仅仅局限于游戏开发,基本上只要是C++,C

    开发出来的大中型项目都必须要有内存管理。

           2.内存管理不只有引用计数一种,还有垃圾回收机制

    二.   Cocos2d-x内存管理机制

    一.   用法:

    第一种:retain,release

    第二种:autorelease(重点)

    Ref类,AutoReleasePool类,PoolManager类

    Ref类

    成员

    unsigned int _refCount;

    主要函数

                  void retain();

            void release();

    CCRef* autorelease();

    AutoReleasePool类

    成员

    std::vector<CCRef*> _managedObjectArray;

    std::string _name;

    主要函数

            AutoReleasePool();

            AutoReleasePool(const std::string &name);

     

            void addObject(CCRef* object);

            void clear();

     

            ~AutoReleasePool();

    PoolManager类

    成员

    std::vector<AutoReleasePool *> _releasePoolStack;

            static PoolManager* s_singleInstance;

    主要函数

    PoolManager();

    static PoolManager* getInstance();

    AutoReleasePool *getCurrentPool() const;

    void push(AutoReleasePool* pool);

    void pop();

    以上的三个类内存管理的描述:

    AutoRelease类的主要成员其实是一个队列,这个队列存放着当前帧的所有元素,

    而Poolmanager类其实是一个栈,这个栈存放着所有的AutoRelease,

    我们可以通过一次次的遍历这些队列,对ref中的引用计数值递减,当他们递减到0时,就可以自动删除了

    看看这个代码:

    Sprite->autorelease();

    他的实现是:

    PoolManager::getInstance()->getCurrentPool()->addObject(this);

    return this;

                       也就是说,每次自动内存管理就是把sprite加到最上面的那个队列中,

                       到这里,我们要问一下,一直都没有减少引用计数,怎么减少呢?

    控制引用计数的函数是:

    AutoRealease::Clear();

    什么时候调用呢?

    PoolManager::getInstance()->getCurrentPool()->clear();

    这个函数在Director::MainLoop()里面

    每一次帧循环都会调用一次这个函数,实现了自动内存管理

    练习:手动创建释放池

    我们已经知道,调用了autorelease()方法的对象将会在自动释放池池释放的时候被释放一次。虽然Cocos2d-x已经保证每一帧结束后释放一次释放池,但是如果在一帧之内生成了大量的autorelease对象,将会导致释放池性能下降。因此在生存autorelease对象密集的区域(通常是循环中)的前后,最后手动创建一个释放池。

      AutoreleasePool pool1;  // 手动创建一个释放池       

        for ()

        {  

            ref->autorelease();  // 循环里面执行autorelease,这些对象会添加到pool1中

        }

    }

     

     

     

        三.CreateFunc(宏)

     

     

    其他:cocos2d-x内存管理机制简洁重现:github链接:https://github.com/JKGameEngine/cocos2d-

     

    游戏循环的理解:参考博客

    http://blog.csdn.net/elloop/article/details/50290423

     

     

    内存管理博客推荐:

    http://www.2cto.com/kf/201407/314375.html

    http://www.cnblogs.com/mmidd/p/3746256.html

     

  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/YTYMblog/p/6171185.html
Copyright © 2011-2022 走看看