Cocos2d-x 3.x:如何进行合理的内存分配(使用AutoreleasePool 来合理的管理内存)
Cocos2d-x 3.x:如何进行合理的内存分配(使用AutoreleasePool 来合理的管理内存)
本文转载至深入理解Cocos2d-x 3.x:如何进行合理的内存分配
设想如下场景,这是一个典型的内存合理分配的场景:在一帧内,有若干个函数,每个函数都会创建一系列的精灵,每个精灵都不同,都会占用一定的内存,精灵的总数可能会有1000个,而一个函数只会创建10个精灵这样,创建的精灵只会在这个函数中使用,大致代码如下:
1
2
3
4
5
|
for ( int i = 0; i < 10; i++)
{
Sprite* s = Sprite::create();
//-- doSomething --
}
|
这样做会造成内存泄露吗?
答案是当然不会,但是这样会造成一帧内的内存峰值过高,因为在引擎的自动内存管理中,所有的释放内存操作都是在每一帧的结束才会进行的,所以就算申请的内存在这一帧中不会有其他地方会使用,它的内存也不会随着作用域的结束而释放的。
那么我们应该如何优化这段代码呢?如下
1
2
3
4
5
6
|
AutoreleasePool pool;
for ( int i = 0; i < 10; i++)
{
Sprite* s = Sprite::create();
//-- doSomething --
}
|
只需要在函数的第一句加上
1
|
AutoreleasePool pool;
|
就可以实现在函数结束的时候自动将create的指针释放了,那么为什么会有那么神奇的效果呢?我们来分析一下这个函数的构造函数以及析构函数,首先分析一下构造函数:
1
2
3
4
5
6
|
AutoreleasePool::AutoreleasePool()
: _name( "" )
{
_managedObjectArray.reserve(150);
PoolManager::getInstance()->push( this );
}
|
他向PoolManager的单例中push了自己,我们进入push中看看它的具体实现
1
2
3
4
|
void PoolManager::push(AutoreleasePool *pool)
{
_releasePoolStack.push_back(pool);
}
|
直接向_releasePoolStack栈中压入了this,那这个将会起到什么效果呢?这就不得不说一下autorelease的实现了,众所周知,create函数的内存自动管理机制依赖于autorelease函数,那么autorelease函数是干嘛用的呢:
1
2
3
4
5
|
Ref* Ref::autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject( this );
return this ;
}
|
向某个Pool池添加对象,那么getCurrentPool获取的是那个内存管理池呢?
1
2
3
4
|
AutoreleasePool* PoolManager::getCurrentPool() const
{
return _releasePoolStack.back();
}
|
就是最后我们通过push添加进来的那个池子,所以每创建一个AutoreleasePool 对象,都会压入PoolManager中。然后后续的autorelease操作是将对象加入到最新创建的AutoreleasePool 对象中。
那么最终要通过什么途径让函数在函数结束的时候自动释放内存呢?我们知道,作用域结束的时候,会调用普通对象的析构函数,那么就来看看AutoreleasePool 的析构函数执行了什么吧
1
2
3
4
5
|
AutoreleasePool::~AutoreleasePool()
{
clear();
PoolManager::getInstance()->pop();
}
|
第一个是clear函数,这是一个非常关键的函数,我们跟踪进去
1
2
3
4
5
6
7
8
|
void AutoreleasePool::clear()
{
for ( const auto &obj : _managedObjectArray)
{
obj->release();
}
_managedObjectArray.clear();
}
|
它会将所有addObject的对象全部执行一次release操作。这样就可以实现在函数结束的时候自动释放内存了。
1
|
PoolManager::getInstance()->pop();
|
这一行代码主要是从PoolManager中将当前AutoreleasePool 对象弹出栈(因为当前对象已经析构了)
上述就是通过使用AutoreleasePool 来合理的管理内存了。
转载于:https://www.cnblogs.com/dudu580231/p/4560039.html
Cocos2d-x 3.x:如何进行合理的内存分配(使用AutoreleasePool 来合理的管理内存)相关推荐
- Android面试,给正在找工作的安卓攻城师们 ... ...
从java基础技能到安卓进阶技能,有你想象不到的全面. ☆ JAVA技能 « 有良好的JAVA基础,熟练掌握面向对象思想: 理解面向对象: 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是 ...
- Android开发面试经典题目
下面是整理的Android知识点,可以平时巩固知识点,仅供复习使用. ☆ JAVA技能 有良好的JAVA基础,熟练掌握面向对象思想: 理解面向对象: 面向对象是一种思想,是基于面向过程而言的,就是说 ...
- 如何优化cocos2d程序的内存使用和程序大小:第一部分
译者: 在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区 ...
- cocos2d的常用动作及效果总结之五:Animation
这一篇是讲一下如何在cocos2d中实现动画. 实现动画的步骤: 加载帧 生成动画对象 运行动画 加载帧我用过两种方式: 第一种是使用.plist文件,通过CCSpriteFrameCache读取动画 ...
- 如何优化cocos2d/x程序的内存使用和程序大小
评论(9) 收藏 举报 目录(?)[+] 本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/ip ...
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
译者: 在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区 ...
- Cocos2d之Ref类与内存管理使用详解
一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被 ...
- 怎样优化cocos2d/x程序的内存使用和程序大小
再次感谢原创者:Steffen Itterheim.原创博客原文地址: http://www.learn-cocos2d.com/2012/11/optimize-memory-usage-bundl ...
- 如何优化cocos2d/x程序的内存使用和程序大小【第一部分】
转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/1043.html ☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您! ...
- Cocos2d 面试题
转自:http://blog.sina.com.cn/s/blog_5e76a4050102xi8c.html 2.cocos2d-x 程序的结束流程? 程序运行时期,由 mainLoop 方法维持运 ...
最新文章
- 百度宣布:搜索业务总裁向海龙离职,另回购10亿美元股份
- 提升开发效率的一款mybatis开发神器
- 分享一个iec104协议的资源,一个模拟iec104协议主站端的小工具
- R语言基于机器学习算法进行特征筛选(Feature Selection)
- nmp的php.ini,Just for fun——Docker做个NMP环境
- MS CRM 2011 RC中的新特性(2)——销售自动化方面
- 美国计算机专业 学校推荐信,美国大学计算机专业推荐信范文
- nginx做透明代理
- java-回调机制详解
- jsp iframe嵌入php,jsp中的iframe什么意思
- 用Prettier和ESlint来统一提交代码
- oracle表内连接和外连接
- 删除 srvinstw安装的服务
- 设计模式-单一职责原著
- lol服务器不稳定领皮肤,LOL免费领“源代码娜美”皮肤 官方致歉游戏卡顿问题...
- 『英语杂谈』 [好文共赏]Heal the World(转载)
- linux grep 和 find 命令
- web应用票据打印实现(四)
- 快来看!网信办发布《网络信息内容生态治理规定》,涉网暴、水军、流量造假等等...
- 配置文件格式详解之终极无惑