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

cocos2d-x内存管理的更多相关文章

  1. cocos2d内存管理

    设想如下场景, 这是一个典型的内存合理分配的场景: 在一帧内, 有若干个函数, 每个函数都会创建一系列的精灵, 每个精灵都不同, 都会占用一定的内存, 精灵的总数可能会有1000个, 而一个函数只会创 ...

  2. 【Cocos2d-x 3.x】内存管理机制与源码分析

    侯捷先生说过这么一句话 :  源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...

  3. cocos2d-x内存管理(见解)

    cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push ...

  4. Cocos2d-x内存管理研究<二>

    http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04   上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...

  5. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  6. cocos2dx内存管理的一些看法

    今年年初进入一家游戏公司,正式开始游戏引擎的学习,之前的ios学习,对现在的游戏引擎学习还是有很大的帮助的,虽然使用c++,但却能时刻感受到ios框架对于cocos2dx的巨大影响. 由于之前一直使用 ...

  7. 如何优化cocos2d/x内存使用和程序大小的程序

    从最初的:http://www.himigame.com/iphone-cocos2d/1043.html 译者: 在我完毕第一个游戏项目的时候.我深切地意识到"使用cocos2d来制作游戏 ...

  8. Cocos2D-X2.2.3学习笔记3(内存管理)

    本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...

  9. cocos2dx内存管理

    cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象. ...

  10. [置顶] 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/13765639 再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的 ...

随机推荐

  1. 基于SOA分布式架构的dubbo框架基础学习篇

    以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...

  2. MySQL5.7 error log时间显示问题

    最近有两三套环境升级到了5.7.16,发现mysql.err中的时间好像有些问题,经查是mysql 5.7后的变更,如下: root@localhost [(none)]>select now( ...

  3. Hibernate入门详解

    学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道    什么是Hibernate?    为什么要使用Hibernate?    Hib ...

  4. [deviceone开发]-心形点赞动画示例

    一.简介 这个示例展示do_Animator组件的简单使用,通过点击"点赞"按钮,不断弹出心形图片,向上动画漂移到顶部消失.间隔时间和上下左右移动的步长都是一定范围的随机值.二.效 ...

  5. CSS3写折纸

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. iOS多线程之7.NSOperation的初识

    NSOperation和GCD一样,不用我们管理线程的生命周期,加锁等问题,只要把操作封装进NSOperation中,系统会自动帮我们创建线程,执行操作.而且他是面向对象的,我们看起来更容易理解,使用 ...

  7. Json解析工具的选择

    前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson ...

  8. MVP解析

    一套可以直接复制使用的MVP框架 通过对MVP设计模式学习,对MVP也有了一个初步的认识,以登录Login模块为例,封装MVP如下: package com.example.administrator ...

  9. 简历生成平台项目开发-STEP5初步界面demo实现

    谭卓因为暑期实习,去杭州实习了,走之前在git上上传了一些文档(https://github.com/USTC-CV-creator/),项目到目前为止,前端demo已经做好,后台接收请求生成PDF部 ...

  10. javascript-组合模式

    组合模式笔记 组合模式又称部分-整体模式,将对象组合成树形结构以表示'部分整体'的层次结构 组合模式使得用户对单个对象和组合对象的使用具有一致性 demo实例 :表单模块 要调用到前面学习到的寄生组合 ...