cocos2d-x 内存管理3

来源:互联网 发布:流程优化原则 编辑:程序博客网 时间:2024/05/20 08:01

使用或者不使用自动管理对于编程接口来说是一样的,都是调用release或者autorelease来释放资源。只是他们释放资源的时机不同。release会立马释放资源,如果使用autorelease,他会标记自己,在主循环中由CCPoolManager来释放资源。CCPoolManager每一次循环只会释放一个需要释放的资源。这样保证了游戏运行的流畅度,避免出现卡顿的现象。所以释放多个资源时,一般使用autorelease可以获得更佳的表现。

不推荐手动调用delete来释放资源,不过delete已自动管理的对象不会出现空指针错误。因为在CCObject的析构函数中就已经将自己从CCPoolManager中移去了。你还是要保证其他地方没有使用已经被删除的指针,这个原则总是适用的。用delete可能破坏结构的完整性,不能释放掉全部的资源。

01bool HelloWorld::init()
02{
03    CCSize size = CCDirector::sharedDirector()->getWinSize();
04         CCSprite* sprite = new CCSprite;
05    sprite->initWithFile("HelloWorld.png");
06    sprite->setPosition(ccp(size.width/2, size.height/2));
07 
08    CCSprite* sprite1 = *(sprites.begin());
09    sprite1->setPosition(ccp(size.width/2, size.height/2));
10    CCSprite* sprite2 = *(++sprites.begin());
11    sprite2->setPosition(ccp(size.width/2, size.height/2));
12    delete sprite2;
13    addChild(sprite);
14    addChild(sprite1);
15//  addChild(sprite2);
16    return true;
17}
18 
19void HelloWorld::LoadSprite( void )
20{
21    cocos2d::CCSprite* test;
22    test = new CCSprite;
23    test->initWithFile("test.png");
24    test->autorelease();
25    sprites.push_back(test);
26 
27    cocos2d::CCSprite* test2;
28    test2 = CCSprite::spriteWithFile("test2.png");
29    sprites.push_back(test2);
30}

注意一点的是CCNode的addChild和removeChild会调用retain和release函数。下面的代码是可以工作的,注意到sprite1没有自动管理,removeformParent已经释放了资源,再一次调用release引发崩溃。

01bool HelloWorld::init()
02{
03    CCSize size = CCDirector::sharedDirector()->getWinSize();
04         CCSprite* sprite = new CCSprite;
05    sprite->initWithFile("HelloWorld.png");
06    sprite->setPosition(ccp(size.width/2, size.height/2));
07 
08    CCSprite* sprite1 = *(sprites.begin());
09    sprite1->setPosition(ccp(size.width/2, size.height/2));
10    CCSprite* sprite2 = *(++sprites.begin());
11    sprite2->setPosition(ccp(size.width/2, size.height/2));
12 
13    addChild(sprite);
14    addChild(sprite1);
15    addChild(sprite2);
16    sprite1->removeFromParentAndCleanup(true);
17//  sprite1->release();
18    addChild(sprite1);
19    return true;
20}
21 
22void HelloWorld::LoadSprite( void )
23{
24    cocos2d::CCSprite* test;
25    test = new CCSprite;
26    test->initWithFile("test.png");
27    sprites.push_back(test);
28 
29    cocos2d::CCSprite* test2;
30    test2 = CCSprite::spriteWithFile("test2.png");
31    sprites.push_back(test2);
32}

sprite1的添加覆盖掉了sprite2。图片和上面的代码是一样的。