【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十三课:Cocos2D-X内存管理4-6
2015-06-21 11:47
591 查看
【麦可网】Cocos2d-X跨平台游戏开发---学习笔记
第十三课:Cocos2D-X内存管理4-6
=======================================================================================================================================================================
课程目标:
- Cocos2D-X内存管理机制
课程重点:
- C\C++内存管理机制
- 引用计数内存管理机制
- 自动释放机制
考核目标
- 理解引用计数内存管理机制
- 合理运用自动释放机制
=======================================================================================================================================================================
===================================================================
总结:
先从掌握静态工厂和安全释放宏开始,多用宏,安全又方便。
开心一刻:
四只老鼠吹牛:
甲:我每天都拿鼠药当糖吃;
乙:我一天不踩老鼠夹脚发痒;
丙:我每天不过几次大街不踏实;
丁:时间不早了,回家抱猫去咯。
【麦可网】Cocos2d-X跨平台游戏开发---教程下载:http://pan.baidu.com/s/1kTio1Av
【麦可网】Cocos2d-X跨平台游戏开发---笔记系列:http://blog.csdn.net/qiulanzhu
第十三课:Cocos2D-X内存管理4-6
=======================================================================================================================================================================
课程目标:
- Cocos2D-X内存管理机制
课程重点:
- C\C++内存管理机制
- 引用计数内存管理机制
- 自动释放机制
考核目标
- 理解引用计数内存管理机制
- 合理运用自动释放机制
=======================================================================================================================================================================
一、自动释放池
CCPoolManager sprite->autorelease(); 例: CCSprite* pSprite = CCSprite::spriteWithFile("HelloWorld.png");<span style="white-space:pre"> </span>//自动释放池 this->addChild(pSprite, 0);
其中: CCSprite* CCSprite::spriteWithFile(const char *pszFileName) { CCSprite *pobSprite = new CCSprite(); if (pobSprite && pobSprite->initWithFile(pszFileName)) { pobSprite->autorelease(); //自动释放机制 return pobSprite; } CC_SAFE_DELETE(pobSprite); return NULL; }
二、静态工厂方法
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 *spriteWithSpriteFrame(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里new和release配对才能发挥引用计数的功能。 CCSprite *sprite = new CCSprite(); sprite->release(); 以init开头的都没有自动释放,如:initWithcolorWidthHeight 以名称(如layer\sprite)开头的都有自动释放,如:layerwithcolor
三、Cocos2D-X里用宏实现私有成员get和set
用宏来对私有成员实现get和set,以减少工作量 使用前需包含:头文件“cocos2d.h”和命名空间USING_NS_CC; #define CC_SYNTHESIZE(varType, varName, funName)\ protected: varType varName;\ public: virtual varType get##funName(void) const { return varName; }\ public: virtual void set##funName(varType var){ varName = var; } --------------------------------------------------- 指针型私有成员的set CC_SYNTHESIZE_RETAIN(CCSprite*, _Sprite, Sprite); #define CC_SYNTHESIZE_RETAIN(varType, varName, funName) \ protected: varType varName; \ public: virtual varType get##funName(void) const { return varName; } \ public: virtual void set##funName(varType var) \ { \ CC_SAFE_RETAIN(var); \ //引用计数加1 CC_SAFE_RELEASE(varName); \ <span style="white-space:pre"> </span>//防止内存泄漏,需先delete之前的 varName = var; } -------------------------------------------------------- 安全释放的宏: #define CC_SAFE_DELETE(p) if(p) { delete (p); (p) = 0; } #define CC_SAFE_DELETE_ARRAY(p) <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>if(p) { delete[] (p); (p) = 0; } #define CC_SAFE_FREE(p) <span style="white-space:pre"> </span>if(p) { free(p); (p) = 0; } #define CC_SAFE_RELEASE(p) <span style="white-space:pre"> </span>if(p) { (p)->release(); } #define CC_SAFE_RELEASE_NULL(p) <span style="white-space:pre"> </span>if(p) { (p)->release(); (p) = 0; } #define CC_SAFE_RETAIN(p) if(p) { (p)->retain(); } #define CC_BREAK_IF(cond) if(cond) break;
===================================================================
总结:
先从掌握静态工厂和安全释放宏开始,多用宏,安全又方便。
开心一刻:
四只老鼠吹牛:
甲:我每天都拿鼠药当糖吃;
乙:我一天不踩老鼠夹脚发痒;
丙:我每天不过几次大街不踏实;
丁:时间不早了,回家抱猫去咯。
【麦可网】Cocos2d-X跨平台游戏开发---教程下载:http://pan.baidu.com/s/1kTio1Av
【麦可网】Cocos2d-X跨平台游戏开发---笔记系列:http://blog.csdn.net/qiulanzhu
相关文章推荐
- 游戏开发——Cocos2d-x
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十二课:Cocos2D-X内存管理1-3
- cocos2d—x 常见错误
- cocos2dx tableview基础:实现多图片的滑动显示
- cocos 背景无限滑动!
- cocos studio lua 项目没有 print 输出解决办法
- Cocos2d-3.x_在Lua中使用cjson库解析json
- cocos2dx常见49种Action
- cocos2d-x 菜鸟实习生学习篇-菜单坐标
- error LNK2001: 无法解析的外部符号 "class cocos2d::Vec2 const cocos2d::CCPointZero" (?CCPointZero@cocos2d@@3VV
- cocos2d之回掉函数
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十一课:Cocos2D-X坐标系统2-3
- cocos2dx 解析数据之读取JSON文件
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十课:Cocos2D-X坐标系统1
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第九课: Cocos2D-X引擎框架4
- cocos2dx中init()与onEnter()的区别
- Cocos2d-x之onEnter()、onEnterTransitionDidFinish()、onExit()、onExitTransitionDidStart()
- cocos2dx单场景和多场景的生命周期
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第八课: Cocos2D-X引擎框架3
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第七课: Cocos2D-X引擎框架2