2017-06-03 14:50

 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明,否则将追究法律责任。https://blog.kokojia.com/game/b-63.html

我们在使用cocos2dx游戏引擎的时候,发现他的内存管理和C++不相同,其实cocos2dx是在C++基础上封装了一层而已,底层还是用的C++的内存分配和释放。以下用一个简单的程序描叙cocos2dx内存管理原理。

#include

#include

using namespace std;


//初始化资源和数据

//更新游戏

//绘制游戏


class CObj;


vectorg_managerObj;//用来检测和管理需要自动被删除的对象



class CObj

{

public:

    char name[16];

    int refCount;

    CObj()

    {

        refCount = 1;

        cout<<"一个对象被产生了"<<endl;

        cout<<"一个对象被加入到内存自动释放数组中"<<endl;

        g_managerObj.push_back(this);

    }

    ~CObj()

    {

        cout<<"一个对象被消失了"<<endl;

    }

    

    void retain()//说明有人在使用该对象,所以增加一次引用计数

    {

        refCount++;

    }

    

    void release()//说明有人要释放该对象,不再引用该对象

    {

        refCount--;

        if (refCount==0)

        {

            delete this;

        }

    }

};




int main(int argc, const char * argv[])

{

    CObj * pObj = 0;

    pObj = new CObj;//在该对象的构造函数中我们把该对象加入到了对象自动释放数组中

    pObj->retain();//相当于告诉电脑,有人在使用该对象,不要释放掉我们的对象

    

    while (true)//游戏的主循环

    {

        for (vector::iterator it = g_managerObj.begin(); it != g_managerObj.end(); )

        {

//检测到容器内有元素,直接调用元素的release来释放元素,只有那么调用过retain函数的元素才不会被真的释放

if ((*it)->refCount > 1)

{

printf("容器内有元素,但引用计数器大于1,内存不会被释放,对象将会从容器中删除\\n");

}

else

{

printf("容器内有元素将会被释放内存,因为引用计数等于1\\n");

}

            (*it)->release();//删除掉没有被指定要用的对象

            it = g_managerObj.erase(it);//把对象从自动内存释放数组中删除掉

        }

    }

    //pObj->release();//释放掉对象的内存给系统

    

    return 0;

}


有时候研究游戏引擎源代码对提高程序水平有很大的帮助。

欢迎关注游戏开发者微信公众号1496659198372265.png

 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明,否则将追究法律责任。https://blog.kokojia.com/game/b-63.html

评论