3

当我在游戏中点击重试按钮时,我希望它重新加载 MainScene。我正在这样做:

-(void)retry
{
    SKTransition *transition = [SKTransition fadeWithDuration:.4];
    MainScene *gameOver = [[MainScene alloc] initWithSize:self.size];
    [gameOver didMoveToView:self.view];
    [self.scene.view presentScene:gameOver transition:transition];
}

但是,这会导致每次重试时内存/CPU 使用率都会增加(很多)。大约重试 10-20 次后,会有明显的延迟。

我将我的所有 SKEmitterNode 和 SKSpriteNode 设为静态并修复了内存问题,所以我怀疑我的精灵、发射器等没有从内存中释放,并且每次重试时都会重新加载,使其翻倍。

我正在像这样加载精灵/发射器:

@implementation MainScene {
    SKEmitterNode *_bubbleEmitter;
    SKSpriteNode *_sunglasses;
    ...
}

- (id)initWithSize:(CGSize)size
{
  if (self = [super initWithSize:size]) 
  {
     _sunglasses = [SKSpriteNode spriteNodeWithImageNamed:@"sunglasses"];
     [_sunglasses setPosition:CGPointMake(self.size.width/2,  self.size.height + 10)];
     [self addChild:_sunglasses];

     ...
  }
  return self;
}

我是在加载精灵还是重试错误?

4

1 回答 1

3

这可能是也可能不是原因,但自己调用此方法肯定是错误的:

[gameOver didMoveToView:self.view];

didMoveToView:方法在您呈现场景时由 SKView 发送到场景。这意味着这个方法实际上会运行两次。

还可以通过实现来验证您的场景是否正确释放:

-(void) dealloc
{
    NSLog(@"dealloc: %@", self);
}

查看日志或设置断点以确认场景解除分配。如果不是,请检查内存泄漏和保留周期。

于 2014-03-24T08:33:14.240 回答