cocos2d-x内存管理
Cocos2d-x内存管理
老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想
一. 为什么需要内存管理
1. new和delete
2. 堆上申请的内存作用于整个程序,而不是一个两个函数之内
3. 渲染树和整个游戏循环->引导出内存管理(全局变量,局部变量,和堆上申请的变量比较)
注:游戏循环:可以看作一种死循环
- 绘制
- 自动释放池的计数管理
绘制:包括时间调度,绘制结点等等
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内存管理的更多相关文章
- cocos2d内存管理
设想如下场景, 这是一个典型的内存合理分配的场景: 在一帧内, 有若干个函数, 每个函数都会创建一系列的精灵, 每个精灵都不同, 都会占用一定的内存, 精灵的总数可能会有1000个, 而一个函数只会创 ...
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- cocos2d-x内存管理(见解)
cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push ...
- Cocos2d-x内存管理研究<二>
http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04 上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
- cocos2dx内存管理的一些看法
今年年初进入一家游戏公司,正式开始游戏引擎的学习,之前的ios学习,对现在的游戏引擎学习还是有很大的帮助的,虽然使用c++,但却能时刻感受到ios框架对于cocos2dx的巨大影响. 由于之前一直使用 ...
- 如何优化cocos2d/x内存使用和程序大小的程序
从最初的:http://www.himigame.com/iphone-cocos2d/1043.html 译者: 在我完毕第一个游戏项目的时候.我深切地意识到"使用cocos2d来制作游戏 ...
- Cocos2D-X2.2.3学习笔记3(内存管理)
本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...
- cocos2dx内存管理
cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象. ...
- [置顶] 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/13765639 再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的 ...
随机推荐
- java web学习总结(三十一) -------------------EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- SpringMVC的执行流程(二)
文字解析: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配 DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交 ...
- DOM加载过程中ready和load的区别
在浏览器地址栏输入URL地址,浏览器开始加载页面时,有以下几个过程 1.浏览器开始解析HTML文档 2. 浏览器遇到HTML文档中的<script>元素以及CSS样式文件,并且没有asyn ...
- window下的各种宽高度小结
详细的请打开这里看console.log window.innerWidth: 文档显示区(body)的宽度window.innerHeight 文档显示区(body)的高度window.outr ...
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果下载文件,请添加 MIME 映射。 IIS站点中添加WCF项目后浏览网站报错解决方法。
vs2013 wcf服务 windows10 家庭中文版 上图中的红色没有出现就按照下面的方法做: 按照上图所示勾选. 刷新上图中你的网站,查看上图右边的内容是否出现,如果出现,再次重新浏览网站,看一 ...
- HTML中的标记-遁地龙卷风
第三版 上一版本在未经验证的情况下,盲目的认为很多东西是那样,造成错误,非常抱歉. 0.什么是标记 <input type="checkbox" checked />& ...
- 易企秀微场景2016最新完整版V10.5,小编亲测修复众多错误
易企秀V10.5更新说明1.修复拨号英文错误2.修复转送场景问题3.修复设置场景密码乱码问题4.修复前台批量删除客户图片5.修复数据收集分页问题6.修复图片分类错乱问题7.修复音乐和特效冲突问题8.修 ...
- 国产方法论之 ReDoIt -- 惟思捷
最近上了PMP课程,感觉受益匪浅,思路有被打开. 很同意一个观点“国人很擅长做事,但是不擅长总结出解决问题的通用框架和方法论”. 为了能提高中小企业生产力我最近成了一个小的软件咨询公司取名“惟思捷”, ...
- WEB页面中常见的四种控件的必须的测试
以下为常规的需求,除非需求有明确说明,如密码输入框中可以输入空格. 输入框 1. 为空,但页面中明确说明不能为空(带有星号或者只有这一个输入框),有以下两种情况: a. 不进行输入或者使其为空:焦 ...
- jQuery 获取 radio 选中后的文字
如果html为 <input type="radio" id="test" name="test" value="1&quo ...