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 来合理的管理内存)相关推荐

  1. Android面试,给正在找工作的安卓攻城师们 ... ...

    从java基础技能到安卓进阶技能,有你想象不到的全面. ☆  JAVA技能 « 有良好的JAVA基础,熟练掌握面向对象思想: 理解面向对象: 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是 ...

  2. Android开发面试经典题目

    下面是整理的Android知识点,可以平时巩固知识点,仅供复习使用. ☆  JAVA技能 有良好的JAVA基础,熟练掌握面向对象思想: 理解面向对象: 面向对象是一种思想,是基于面向过程而言的,就是说 ...

  3. 如何优化cocos2d程序的内存使用和程序大小:第一部分

    译者: 在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区 ...

  4. cocos2d的常用动作及效果总结之五:Animation

    这一篇是讲一下如何在cocos2d中实现动画. 实现动画的步骤: 加载帧 生成动画对象 运行动画 加载帧我用过两种方式: 第一种是使用.plist文件,通过CCSpriteFrameCache读取动画 ...

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

    评论(9) 收藏 举报 目录(?)[+] 本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/ip ...

  6. (译)如何优化cocos2d程序的内存使用和程序大小:第一部分

    译者: 在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区 ...

  7. Cocos2d之Ref类与内存管理使用详解

    一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被 ...

  8. 怎样优化cocos2d/x程序的内存使用和程序大小

    再次感谢原创者:Steffen Itterheim.原创博客原文地址: http://www.learn-cocos2d.com/2012/11/optimize-memory-usage-bundl ...

  9. 如何优化cocos2d/x程序的内存使用和程序大小【第一部分】

    转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/1043.html ☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您! ...

  10. Cocos2d 面试题

    转自:http://blog.sina.com.cn/s/blog_5e76a4050102xi8c.html 2.cocos2d-x 程序的结束流程? 程序运行时期,由 mainLoop 方法维持运 ...

最新文章

  1. 百度宣布:搜索业务总裁向海龙离职,另回购10亿美元股份
  2. 提升开发效率的一款mybatis开发神器
  3. 分享一个iec104协议的资源,一个模拟iec104协议主站端的小工具
  4. R语言基于机器学习算法进行特征筛选(Feature Selection)
  5. nmp的php.ini,Just for fun——Docker做个NMP环境
  6. MS CRM 2011 RC中的新特性(2)——销售自动化方面
  7. 美国计算机专业 学校推荐信,美国大学计算机专业推荐信范文
  8. nginx做透明代理
  9. java-回调机制详解
  10. jsp iframe嵌入php,jsp中的iframe什么意思
  11. 用Prettier和ESlint来统一提交代码
  12. oracle表内连接和外连接
  13. 删除 srvinstw安装的服务
  14. 设计模式-单一职责原著
  15. lol服务器不稳定领皮肤,LOL免费领“源代码娜美”皮肤 官方致歉游戏卡顿问题...
  16. 『英语杂谈』 [好文共赏]Heal the World(转载)
  17. linux grep 和 find 命令
  18. web应用票据打印实现(四)
  19. 快来看!网信办发布《网络信息内容生态治理规定》,涉网暴、水军、流量造假等等...
  20. 配置文件格式详解之终极无惑

热门文章

  1. 第四范式完成超10亿元C轮融资,估值12亿美元
  2. 腾讯开源智能运维项目,用机器学习减少人为失误
  3. 【Java】 Java反射机制总结
  4. 顶尖中文大学计算机专业课程体系
  5. round()四舍五入方法的简单使用
  6. 【Node全局变量global模块】
  7. 快速搭建LAMP环境
  8. 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
  9. 浅析数字签名的工作原理 【小白级别的原创文章 仅供扫盲】
  10. PowerManager.WakeLock使用(屏幕恒亮)