关闭

cocos2d-x 内存管理3

1287人阅读 评论(0) 收藏 举报

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

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

01 bool 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  
19 void 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引发崩溃。

01 bool 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  
22 void 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。图片和上面的代码是一样的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:58337次
    • 积分:698
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:19篇
    • 译文:0篇
    • 评论:4条
    最新评论