加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十三课:Cocos2

发布时间:2020-12-14 21:33:42 所属栏目:百科 来源:网络整理
导读:【麦可网】 Cocos2d-X 跨平台游戏开发 --- 学习笔记 第十三课:Cocos2D-X内存管理4-6 ===============================================================================================================================================================

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记

第十三课:Cocos2D-X内存管理4-6

=======================================================================================================================================================================

课程目标:

-Cocos2D-X内存管理机制

课程重点:

-CC++内存管理机制

-引用计数内存管理机制

-自动释放机制

考核目标

-理解引用计数内存管理机制

-合理运用自动释放机制

=======================================================================================================================================================================

一、自动释放池

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
以名称(如layersprite)开头的都有自动释放,如:layerwithcolor


三、Cocos2D-X里用宏实现私有成员getset

用宏来对私有成员实现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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读