这段时间渐渐地从剑II的项目中退出来,来说研究一些cocos2d-x相关的内容。

Cocos2d-x虽然是使用C++来实现的,但是代码显得很怪异。比如下面的代码:

1
2
3
4
5
6
do
{
CC_BREAK_IF(! CCLayer::init());
CCSprite* bomb1 = CCSprite::create("CloseNormal.png");
addChild(bomb1,1);
}while (0)

这里之所以要用do...while,仅仅只是为了使用CC_BREAK_IF这个宏。非但打乱了C++的语法,而且也是代码复杂化了。

另外一个需要注意的地方是它的对象的生命周期管理,和C++通行的逻辑不同。看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
class CSpriteSheetMgr{
public:
CSpriteSheetMgr();
~CSpriteSheetMgr();
private:
cocos2d::CCDictionary *m_pBatchNodeDic;
};
CSpriteSheetMgr::CSpriteSheetMgr()
{
m_pBatchNodeDic = CCDictionary::create();
}

如果你以为m_pBatchNodeDic的生命周期是跟随类的实例的话,那么就错了。在 每一个Message Loop之后,cocos2d-x引擎都会尝试去释放这类对象 ,可能你还没有用到,他就已经无效了。这个就是cocos2d-x的内存管理模型Reference Count and AutoReleasePool

正确的,需要写成:

1
2
3
4
5
CSpriteSheetMgr::CSpriteSheetMgr()
{
m_pBatchNodeDic = CCDictionary::create();
m_pBatchNodeDic->retain();
}

Comments

2013-03-08