Cocos2D场景记忆管理

时间:2012-01-24 15:13:12

标签: iphone cocos2d-iphone xcode4.2

我对Cocos2D有疑问。我在游戏中有两个场景都有很多精灵。当我替换一个场景并加载另一个场景时发生了什么?是否所有的精灵都被自动删除,或者它正在记忆中,并且当我在场景中释放时会被释放?

我无法理解这个事情如何在这种情况下管理内存,所以任何人都可以向我解释这个事情,更重要的是,当我们在场景中加载精灵时,这对我们来说很重要。

3 个答案:

答案 0 :(得分:6)

当您调用replaceScene时,两个场景都会在内存中存在一段时间!如果您使用CCSceneTransition,则两个场景将在转换期间在内存中。

流程如下:

  • 场景A正在运行
  • 使用sceneB
  • 调用CCDirector replaceScene
  • 场景B初始化,可能加载精灵等
  • 场景A已取消分配并释放内存

您可以在更改场景之前在场景中实现-(void) cleanup方法以删除其大部分内容,并且您可能希望将新内容加载到-(void) onEnter { [super onEnter]; }方法。

我个人认为在这种情况下更好的方法是“加载”场景,这两个场景之间的场景(甚至可能不会活动超过几毫秒)。这使得第一个场景时间在初始化下一个场景之前被释放。

答案 1 :(得分:0)

所有精灵都会在新场景加载到内存后释放。除非你保留了精灵。

答案 2 :(得分:0)

如果您正在做的是

CCSprite* sprite = [CCSprite spriteWithFile:@"test.png"];
当你切换/转换场景时,没有任何保留或任何幻想,这个场景的所有孩子(在这个例子中,精灵,将自动释放。你没有取得对象的所有权。

但是如果你说你是否拥有对象的所有权,例如:

hero = [[CCSprite spriteWithFile:@"hero.png"] retain];
// or
hero = [[CCSprite alloc] initWithFile:@"hero.png"];

然后你需要在你的dealloc中释放它