cocos2d内存管理
设想如下场景,
这是一个典型的内存合理分配的场景:
在一帧内,
有若干个函数,
每个函数都会创建一系列的精灵,
每个精灵都不同,
都会占用一定的内存,
精灵的总数可能会有1000个,
而一个函数只会创建10个精灵这样,
创建的精灵只会在这个函数中使用,
大致代码如下:
- for(int i = 0; i < 10; i++)
- {
- Sprite* s = Sprite::create();
- //-- doSomething --
- }
这样做会造成内存泄露吗?
答案是当然不会,
但是这样会造成一帧内的内存峰值过高,
因为在引擎的自动内存管理中,
所有的释放内存操作都是在每一帧的结束才会进行的,
所以就算申请的内存在这一帧中不会有其他地方会使用,
它的内存也不会随着作用域的结束而释放的。
那么我们应该如何优化这段代码呢?如下
- AutoreleasePool pool;
- for (int i = 0; i < 10; i++)
- {
- Sprite* s = Sprite::create();
- //-- doSomething --
- }
只需要在函数的第一句加上 AutoreleasePool pool;
就可以实现在函数结束的时候自动将create的指针释放了,
那么为什么会有那么神奇的效果呢?
我们来分析一下这个函数的构造函数以及析构函数,
首先分析一下构造函数:
- AutoreleasePool::AutoreleasePool()
- : _name("")
- {
- _managedObjectArray.reserve(150);
- PoolManager::getInstance()->push(this);
- }
他向PoolManager的单例中push了自己,
我们进入push中看看它的具体实现
void PoolManager::push(AutoreleasePool *pool)
{
_releasePoolStack.push_back(pool);
}
直接向_releasePoolStack栈中压入了this,
那这个将会起到什么效果呢?
这就不得不说一下autorelease的实现了,
众所周知,
create函数的内存自动管理机制依赖于autorelease函数,
那么autorelease函数是干嘛用的呢:
Ref* Ref::autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject(this);
return this;
}
向某个Pool池添加对象,
那么getCurrentPool获取的是那个内存管理池呢?
AutoreleasePool* PoolManager::getCurrentPool() const
{
return _releasePoolStack.back();
}
就是最后我们通过push添加进来的那个池子,
所以每创建一个AutoreleasePool 对象,
都会压入PoolManager中。
然后后续的autorelease操作是将对象加入到最新创建的AutoreleasePool 对象中。
那么最终要通过什么途径让函数在函数结束的时候自动释放内存呢?我们知道,作用域结束的时候,会调用普通对象的析构函数,那么就来看看AutoreleasePool 的析构函数执行了什么吧
AutoreleasePool::~AutoreleasePool()
{
clear();
PoolManager::getInstance()->pop();
}
第一个是clear函数,
这是一个非常关键的函数,
我们跟踪进去
void AutoreleasePool::clear()
{
for (const auto &obj : _managedObjectArray)
{
obj->release();
}
_managedObjectArray.clear();
}
它会将所有addObject的对象全部执行一次release操作。
这样就可以实现在函数结束的时候自动释放内存了。
PoolManager::getInstance()->pop();
一行代码主要是从PoolManager中将当前AutoreleasePool 对象弹出栈(因为当前对象已经析构了)
上述就是通过使用AutoreleasePool 来合理的管理内存了
cocos2d内存管理的更多相关文章
- cocos2d内存管理,类的生命周期
下面资料来自<Cocos2d-x之Lua核心编程>
- 【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-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脚本相关的 ...
随机推荐
- linux程序处理po多语言的两种脚本配置方式
1.在configure.ac里面配置ALL_LINGUAS,然后调用AM_GLIB_GNU_GETTEXT 2.在po目录下面放置LINGUAS文件,由gettextize来生成并处理
- 安装scikit-learn过程记录
环境:Windows 10 X64企业版. 安装python2.7: 官网下载python-2.7.12.amd64.msi安装文件,过程不赘述.安装完成后在PATH环境变量中加入%PYTHON_HO ...
- npm run-script
package.json "scripts": { "start": "electron .", "package": ...
- Socket通信的理解
1.Socket(套接字) 是支持TCP/IP通信的基本操作单元.包含通信的五种必须信息:通信使用的协议,本机IP和端口,远程IP和端口. 2. 1.TCP连接 手机能够使用联网功能是因为手机底层实现 ...
- VS插件开发,启用实验室环境
启用外部程序: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe 命令行参数 /rootsuffix ...
- BloomFilter 与 Cuckoo Filter
BloomFilter 与 CuckooFilter Bloom Filter 原理 Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个相互独立的H ...
- 浅谈T-SQL中的联接查询
引言 平时开发时,经常会使用数据库进行增删改查,免不了会涉及多表联接.今天就简单的记录下T-SQL下的联接操作. 联接类型及其介绍 在T-SQL中联接操作使用的是JOIN表运算符.联接有三种基本的类型 ...
- 将Ubuntu 15.10升级到Ubuntu 16.04
Ubuntu 16.04 LTS 代号为 Xenial Xerus,其最终版将于 2016 年 4 月 21 日正式发布,Ubuntu16.04 将是非常受欢迎的开源操作系统 Ubuntu 的第 6 ...
- JSON的parse()和stringfy()方法
1.JSON.parse; 作用:将JavaScript对象表示法的JSON字符串转换为对象(字符串转对象). 语法:JSON.parse(text [, reviver]) text 必选. 一个有 ...
- php加速运行优化
一个系统的运行性能,除了程序本身要写的完善,还有要看php本身的一些问题,对于php的运行优化,主要有这些加速器:wincache,xcache,ZendOPcache,eAccelerator加速器 ...