cocos2dx概要及开发技术-----Cocos2d-x内存管理
2015-04-21 23:38
274 查看
目的:了解cocos2dx内存管理机制
内存管理机制
1 c++内存管理机制
(1)new /delete C++中新增 (注意:释放数组用 delete[])
char* p = new char;
delete p;
char* pArr = new char[5];
delete[] pArr;
(2)malloc / free c语言原有的
char* p = (char*) malloc(sizeof(char));
free(p);
2 引用计数管理机制(实现简单,缺点是循环引用)
(1) 接口
sprite->retain(); //计数加1 如果对一个对象赋值,需要手动加一
sprite->release();//计数减一
sprite->retainCount();//返回计数
(
其他机制还有
《2. 标记-清扫(mark-sweep)
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
《3 节点复制(copying)
基本思路是把整个内存空间一分为二,不妨记为 A 和 B。所有对象的内存在 A 中分配,当 A 塞满的时候,同样从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象复制到 B 去,然后对调 A 和 B 的角色。
《4 分代(generational)垃圾收集。它的基本思路是这样的:程序中存在大量的临时对象,分配出来之后很快就会被释放,而同时如果一个对象分配出来之后相当长的一段时间内都没回收,那么极有可能它的生命周期很长,尝试收集它会是无用功。所以可以把内存有意识地按“对象年龄”分成若干块,不妨记为老中青(XD),所有的分配都在青代进行,青代塞满只对青代做 GC,然后把存活下来的对象移动到中代,直到中青代都塞满,再把存活下来下来的对象移动到老代 —— 这只是个思路上的例子,实践中分代式垃圾收集算法的方案五花八门,而且常常同时使用了不止一种基本算法(比如青代用节点复制,老代用标记清扫啥的)。
)
——引申《代码的未来》,其中的 “2.4 内存管理” 对GC有较详细的论述,
并且也对几种不同编程语言的GC做了比较。
补一下2.4的章节目录:
2.4 内存管理 61
看似无限的内存 61
GC的三种基本方式 62
术语定义 62
标记清除方式 63
复制收集方式 64
引用计数方式 65
引用计数方式的缺点 65
进一步改良的应用方式 66
分代回收 66
对来自老生代的引用进行记录 67
增量回收 68
并行回收 69
GC大统一理论 69
3 自动释放机制
cocos2dx自带一个全局的内存池PoolManager,即程序内部在new之后,sprite->autorelease();
接口中,
带init不具有自动释放机制,需new了之后再调用。
带create的具有new和自动释放机制。
4 get set的设计方法及宏,不直接访问内部变量。
(1)cocos2dx自带了属性宏 CC_SYNTHESIZE,来自动化实现get set语句声明与定义。
(2)CC_SYNTHESIZE_RETAIN 宏,只定义指针类型的get set声明。
内存管理机制
1 c++内存管理机制
(1)new /delete C++中新增 (注意:释放数组用 delete[])
char* p = new char;
delete p;
char* pArr = new char[5];
delete[] pArr;
(2)malloc / free c语言原有的
char* p = (char*) malloc(sizeof(char));
free(p);
2 引用计数管理机制(实现简单,缺点是循环引用)
(1) 接口
sprite->retain(); //计数加1 如果对一个对象赋值,需要手动加一
sprite->release();//计数减一
sprite->retainCount();//返回计数
(
其他机制还有
《2. 标记-清扫(mark-sweep)
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
《3 节点复制(copying)
基本思路是把整个内存空间一分为二,不妨记为 A 和 B。所有对象的内存在 A 中分配,当 A 塞满的时候,同样从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象复制到 B 去,然后对调 A 和 B 的角色。
《4 分代(generational)垃圾收集。它的基本思路是这样的:程序中存在大量的临时对象,分配出来之后很快就会被释放,而同时如果一个对象分配出来之后相当长的一段时间内都没回收,那么极有可能它的生命周期很长,尝试收集它会是无用功。所以可以把内存有意识地按“对象年龄”分成若干块,不妨记为老中青(XD),所有的分配都在青代进行,青代塞满只对青代做 GC,然后把存活下来的对象移动到中代,直到中青代都塞满,再把存活下来下来的对象移动到老代 —— 这只是个思路上的例子,实践中分代式垃圾收集算法的方案五花八门,而且常常同时使用了不止一种基本算法(比如青代用节点复制,老代用标记清扫啥的)。
)
——引申《代码的未来》,其中的 “2.4 内存管理” 对GC有较详细的论述,
并且也对几种不同编程语言的GC做了比较。
补一下2.4的章节目录:
2.4 内存管理 61
看似无限的内存 61
GC的三种基本方式 62
术语定义 62
标记清除方式 63
复制收集方式 64
引用计数方式 65
引用计数方式的缺点 65
进一步改良的应用方式 66
分代回收 66
对来自老生代的引用进行记录 67
增量回收 68
并行回收 69
GC大统一理论 69
3 自动释放机制
cocos2dx自带一个全局的内存池PoolManager,即程序内部在new之后,sprite->autorelease();
接口中,
带init不具有自动释放机制,需new了之后再调用。
带create的具有new和自动释放机制。
4 get set的设计方法及宏,不直接访问内部变量。
(1)cocos2dx自带了属性宏 CC_SYNTHESIZE,来自动化实现get set语句声明与定义。
(2)CC_SYNTHESIZE_RETAIN 宏,只定义指针类型的get set声明。
相关文章推荐
- cocos2dx概要及开发技术------了解Cocos2d-x整个引擎框架
- cocos2dx概要及开发技术—认识cocos2d-x游戏引擎
- cocos2dx概要及开发技术-----Cocos2d-x UI系统
- cocos2dx概要及开发技术------Cocos2d-x坐标系统
- cocos2dx概要及开发技术——Cocos2D-X跨平台开发环境搭建(win32)
- cocos2dx概要及开发技术—游戏开发技术
- cocos2dx概要及开发技术—游戏原理与机制
- [cocos2dx-html5]手把手,快速搭建 Cocos2d-HTML5 开发调试环境
- 【Cocos2d-X(2.x) 游戏开发系列之一】cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解!在2.x版CCFileData类被去除等
- Cocos2d-x mac下eclipse开发环境的搭建, 创建跨平台的cocos2dx项目
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--其他
- [Cocos2d-x开发问题-3] cocos2dx动画Animation介绍
- Cocos2d-x游戏开发之整合cocos2dx的Android项目到Xcode项目中
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--地图(二)
- 读<<cocos2d-x 游戏技术开发精解>>_1
- 【COCOS2DX-游戏开发之三五】cocos2d-x 3.0 播放MP4视频(转)
- 20、Cocos2dx 3.0游戏开发找小三之Cocos2d-x的动作机制:嘻,善哉!技盖至此乎?
- 21、Cocos2dx 3.0游戏开发找小三之Cocos2d-x中的动画与场景特效
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--游戏开始界面
- cocos2dx游戏开发简单入门视频教程 (cocos2d-x)- 第1天