《Cocos2d-x 高级开发教程》读书笔记1:内存管理
来源:互联网 发布:淘宝自己组装iphone 编辑:程序博客网 时间:2024/06/04 22:47
《Cocos2d-x 高级开发教程》读书笔记1:内存管理
现有智能内存管理技术
- 引用计数
可以说这种方法使用还是比较广泛,之前在读android源码时也发现是使用这种方法。其原理理解下来就是在系统的基类中添加一个引用变量,当继承该基类的实例被开辟时,则引用计数变量+1,当释放时如果引用计数-1等于零时,说明该对象生命周期结束,可以安全释放资源。
书中提到,该方法的优点:维护引用计数比维护生命周期信息轻松很多,将new和delete转换成了使用和使用结束的事件。
缺点:堆碎片和管理烦琐依然存在。
- 垃圾回收
最有名的垃圾回收机制应该就是Java中的垃圾回收。
优点:将程序员从复杂的内存管理中全完解放,防止内存泄露,有效的使用内存
缺点:通常作为一个单独的低级别线程运行,不能手动指派垃圾回收器回收某个对象,也就是说缺少灵活性。
Cocos2d-x中使用的内存管理
- 其重点分为两点:引用计数和自动回收(autorelease)
Cocos2d-x来源于Cocos2d-iphone,所以与objective-c一样,也采用引用计数和自动回收的机制。
Cocos2d-x的根类为CCObject,所有类都派生于该类。在该类中实现了引用计数机制,实现了几个比较重要的API:
unsigned int retainCount(void) ; //获取当前引用计数的值void retain(void); // 引用计数值+1void release(void); // 引用计数值-1CCObject *autorelease(void); // 将对象放入自动回收池
- 自动回收池的几个特点:
1. 可以手动创建和释放
2. 可以嵌套
3. 当回收池自身被释放时,对池中所有对象执行一次release()方法
4. 引擎在每次游戏循环开始前会建立一个回收池,并在每一帧结束时,池中对象也都会执行一次release()方法
所以说当执行autorelease()方法时,并不会像release()方法一样马上将引用计数值-1,而是和该对象执行autorelease后所加入的回收池的生命周期密切相关。
- 如何创建和释放回收池
通过调用CCPoolManager->push()和CCPoolManager->pop()两个方法。之所以使用push和pop两个单词,也是因为回收池内部排列成栈的原因所致,只有在栈顶的回收池才能加收对象的加入。
CCPoolManager::sharedPoolManager()->push(); //push一个回收池,也可以说是添加一个回收池.......... // 各种创建对象后调用autorelease方法CCPoolManager::sharedPoolManager()->pop() // 销毁刚才调用push方法创建的回收池,因为是栈类型,也只能销毁最近一次调用push方法创建的回收池。此外也销毁所以池中对象,也就是那些在push与pop之间调用autorelease的对象。
- autorelease优缺点:
优点:在有些时候无法直接调用release释放,如在工厂模式中,此时非常适合使用autorelease
缺点:
1. 池中对象过多会导致资源紧张
2. 如autorelease时出现错误则难以调试
所以尽量使用release方法而在一些必要时候才使用autorelease方法
- 另外几个结论:
1. 对象传值时,应考虑新旧对象相同的特殊情况
2. 工厂方法返回前,应调用autorelease方法
附:
Cocos2d-x提供内存相关的一些宏在"platform/CCPlatformMacros.h"中:
仅举例两个应该是常用的:
CC_SAFE_RELEASE(p);// 释放p对象,如果已经为null则不做处理
CC_SAFE_RELEASE_NULL(p);// 释放p对象,释放后至为null,如果已经为null也不做处理
---------------------------------------------------------------------------------------------------------------------
该文是读书笔记,包含自己的一些见地,如有错误欢迎评论或加QQ或微信指正交流:QQ/WeChat:263113565
0 0
- 《Cocos2d-x 高级开发教程》读书笔记1:内存管理
- Cocos2d-x高级开发教程
- cocos2d-x开发内存管理
- Cocos2d-x高级开发教程阅读笔记
- cocos2d-x 内存管理1
- 【cocos2d-x游戏开发】Cocos2d-x中的内存管理
- Cocos2d-x开发中C++内存管理
- Cocos2d-x开发中Ref内存管理
- Cocos2d-x开发中Ref内存管理
- Cocos2d-x开发中Ref内存管理
- Cocos2d-x 内存管理
- cocos2d-x:内存管理
- Cocos2d-x内存管理
- Cocos2d-x内存管理
- COCOS2D-X内存管理
- Cocos2d-x 内存管理
- cocos2d-x内存管理
- cocos2d-x内存管理
- 每日学习心得:Js基本数据类型常用方法扩展
- 室内定位技术
- 求二叉树的先序遍历
- 目标检测的图像特征提取之(一)HOG特征
- 目标检测的图像特征提取之(二)LBP特征
- 《Cocos2d-x 高级开发教程》读书笔记1:内存管理
- Android二维码功能实现,在程序内嵌入ZXing项目
- 目标检测的图像特征提取之(三)Haar特征
- 计算机视觉目标检测的框架与过程
- Class的getCanonicalName和getSimpleName getName的区别与应用
- poj 1830 开关问题(高斯消元)
- Java 单例模式详解
- PEP-8 中文翻译
- hdu 1789 正统的贪心问题!!!想了好长时间!