当我在游戏中点击重试按钮时,我希望它重新加载 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/