繁体   English   中英

如何完全卸载SpriteKit Scene

[英]How to completely unload SpriteKit Scene

当我在游戏中点击重试按钮时,我希望它重新加载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设置为静态并修复了内存问题,所以我怀疑我的精灵,发射器等没有从内存中释放出来,并且每次重试时都会重新加载,加倍。

我正在加载像这样的sprite / emitters:

@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;
}

我加载精灵还是重试错了?

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

[gameOver didMoveToView:self.view];

当您呈现场景时, didMoveToView:方法发送到场景。 这意味着这种方法实际上会运行两次。

还要通过以下方式验证您的场景是否正确解除分配:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM