cocos2d-x学习之自动内存管理
一.自动内存管理
1)概述
C++语言默认是没有提供自动内存管理的。使用者需要自己分配,自己释放。在cocos2d-x里提供了一个自动内存管理的方案。主要是通过CCObject来提供的,用户只要继承了CCObject,就可以通过调用autorelease()来告诉系统进行自动内存管理。
一般用法就是: CCLayer* pLayer = CreateLayer(s_nActionIdx); pLayer->autorelease();
2)自动内存管理的实现
自动内存管理的实现原理大概是:用户设置自动释放功能时,内存管理(CCPoolManager)会自动把这个CCObject对象加入其管理池中。等到一定时机(场景销毁,一帧渲染结束,程序退出等),内存管理会遍历其所管理的每一个对象,逐个调用CCObject的释放函数进行释放。CCObject自己内部设置一个引用系数,增加一个使用就系数加一,释放就系数减一,当系数为0时,才真正进行释放。
如果研究下CCPoolManager,会发现进行真正内存管理的是自动释放池(CCAutoreleasePool),CCPoolManager下面包含有多个CCAutoreleasePool。CCAutoreleasePool提供了addObject,removeObject,clear功能。我开始很疑惑,因为进行内存释放管理,一个CCAutoreleasePool就够了。后来仔细考虑,发现了这个的秘密所在:
CCPoolManager管理多个CCAutoreleasePool,是为了方便确定哪个自动释放池(CCAutoreleasePool)可以进行释放,而不用影响到其他的自动释放池。比如在关卡切换时,上一个关卡的自动释放池的数据就可以进行自动释放了,而新关卡的自动释放池不变~~ 好想法!
二、引用计数器——手动管理内存
- //引用次数+1
- virtual void CCObject::retain(void);
- //引用次数-1;若引用计数器=0,则delete this;
- virtual void CCObject::release(void);
- //helper方法,快速判断当前对象只有唯一引用
- bool CCObject::isSingleRefrence(void);
- //返回引用次数
- unsigned int CCObject::retainCount(void);
- CCObject *obj=new CCObject;
- ...
- obj->release();
- obj->retain();
- ...
- obj->release();
- void CCNode::setGrid(CCGridBase* pGrid)
- {
- CC_SAFE_RETAIN(pGrid);
- CC_SAFE_RELEASE(m_pGrid);
- m_pGrid = pGrid;
- }
相关接口:
- CCObject* CCObject::autorelease(void);
- CCObject *obj=new CCOjbect;
- obj->autorelease();
- ...
- virtual void addChild(CCNode * child);
- virtual void addChild(CCNode * child, int zOrder);
- virtual void addChild(CCNode * child, int zOrder, int tag);
- virtual void removeChild(CCNode* child, bool cleanup);
- void removeChildByTag(int tag, bool cleanup);
- virtual void removeAllChildrenWithCleanup(bool cleanup);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect, const CCPoint& offset);
- static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
- static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName);
- static CCSprite* spriteWithFile(const char *pszFileName);
- static CCSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);
- static CCSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);
cocos2d-x学习之自动内存管理相关推荐
- 【JVM高级特性与最佳实践(第3版)-周志明】-学习记录之【自动内存管理】
写在前面,不是原创,是周志明老师书里得内容,方便个人随时学习查看,因为发布得时候没有这个选项,只能选原创 一.概述 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作 ...
- 云和恩墨技术通讯:Oracle AMM自动内存管理引起数据库阻塞
各位亲爱的用户/读者朋友们: 为了及时共享行业案例,通告共性问题,达成知识共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>(4月刊),通过对过去一段时间的知识回顾和故障归纳,以期提供有 ...
- Cocos2d之Ref类与内存管理使用详解
一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被 ...
- 【Java书笔记】:《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2部分-自动内存管理,第3部分-虚拟机执行子系统,第5部分-高效并发
作者:周志明 整理者GitHub:https://github.com/starjuly/UnderstandingTheJVM 第2部分-自动内存管理 第2章 Java内存区域与内存溢出异常 2.2 ...
- python基于值的自动内存管理方式是什么_Python采用的是基于值得自动内存管理方式。(2.0分)_学小易找答案...
[多选题]下列有关关键绩效指标表述正确的是( ) [单选题]上级和员工之间以持续沟通来预防和解决员工实现绩效时可能发生的各种问题的过程,这是绩效管理的( )环节 [单选题]下列有关双因素理论的描述中, ...
- 第五篇:初识JVM,JVM自动内存管理
文章目录 一.前言 1.1 计算机==>操作系统==>JVM 1.1.1 虚拟与实体(对上图的结构层次分析) 1.1.2 Java程序执行(对上图的箭头流程分析) 二.JVM内存空间与参数 ...
- 适当地使用公共语言运行库的垃圾回收器和自动内存管理
小心不要给每个请求分配过多内存,因为这样垃圾回收器将必须更频繁地进行更多的工作.另外,不要让不必要的指针指向对象,因为它们将使对象保持活动状态,并且应尽量避免含 Finalize 方法的对象,因为它们 ...
- Slide:深入了解Oracle自动内存管理ASMM by Maclean Liu
深入了解Oracle自动内存管理asmm View more documents from Maclean Liu 转载于:https://blog.51cto.com/maclean/1278029
- 内存分段分页机制理解_深入理解虚拟机,JVM高级特性-自动内存管理机制
什么是自动内存管理机制? 对于java程序员来说,有一点是要比C/C++程序员要方便的,那就是程序在运行时,java程序不需要为每一个对象其编写对应的释放内存的代码,JVM虚拟机将为你在合适的时间去释 ...
最新文章
- mysql 中遍历查询_mysql中循环查询
- 北京大学启用人脸识别系统:学生“刷脸”入校
- Android开发之Android studio自动签名打包release 版本的正确姿势(完整版) | 文末尾附有Google官方签名教程
- html5 video修改默认样式,HTML5中将video设置为背景的方法
- 创建struct fib_info
- 如何实现按钮水平居中
- 31岁零基础转行软件测试,现已成功入职月薪14K+
- 前端 JS 之 AJAX 简介及使用
- Java生成唯一GUID UUID
- think-queue使用教程-用户注册场景异步发送邮件
- pb获取当月最后一天
- C语言平面几何19-三角形的重心和垂心
- 开源机器人库orocos KDL 学习笔记(二):Geometric
- java for循环迭代_Java for循环棘手迭代
- 堡垒机,ssh协议,telnet协议,b/s架构
- 项目型IT公司向产品型IT公司演进的必要性
- 正规军入场!HashKey Capital区块链基金正式推出
- opic4:Qt入门之常用qt控件认知之Button系列
- 下载 | 5 本程序员成长必读书籍
- C语言I博客作业08