ios - 如何完全卸载 SpriteKit Scene

标签 ios sprite-kit skscene skview

当我在游戏中点击重试按钮时,我希望它重新加载 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 、发射器等没有从内存中释放,并且每次我点击重试时都会重新加载,加倍。

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

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

我是加载 Sprite 还是重试错误?

最佳答案

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

[gameOver didMoveToView:self.view];

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

同时验证您的场景是否通过实现正确解除分配:

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

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

关于ios - 如何完全卸载 SpriteKit Scene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22599566/

相关文章:

ios - 从iOS中的C函数内部生成带有Swift入口点的生成线程

ios - 为现有应用创建新的 IOS 应用证书和配置文件

ios - 如何知道我的 UITableView 中没有选择任何行?

ios - SpriteKit : How to make physics body of a sprite to copy an actual image?

ios - Spritekit 物理实体与错误的实体碰撞

ios - 如何为 SKScene 的子类创建初始化程序

ios - 何时使用 sceneDidLoad v didMove(查看 :)

ios - 在 UITableView 中显示一个表中的中型数据集

ios - 用地面纹理节点填充屏幕

swift - 从菜单场景 View 转换后新场景 View 未居中