如何在SpriteKit场景之间移动时释放内存

时间:2015-08-10 15:32:29

标签: ios7 ios8 sprite-kit

我制作了一个包含10个不同场景的spritekit游戏,其中一个基本场景指向每个场景。当我移动到每个场景时,内存不断上升,假设由于纹理缓存,如前所述。

问题是内存持续上升到300 MB,在弱设备中它会在3-4个场景后崩溃。我试过"免费"内存使用清理功能:

- (void)willMoveFromView:(SKView *)view {

    [self.children enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        SKNode* child = obj;
        [child removeAllActions];
    }];

    [self removeAllChildren];       
}

然而,这并没有帮助。任何想法如何解决这个问题?

这是我的主要(也是唯一的)ViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
//    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = YES;

    // Create and configure the scene.
    MainMenu *scene = [MainMenu sceneWithSize: self.view.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];
}

然后切换到场景代码:

- (void)switchToRoom
{
    SKTransition *transition = [SKTransition fadeWithColor:[UIColor whiteColor] duration:0.5];

    SKScene * scene = [[RoomScene alloc] initWithSize:self.size];

    [self.view presentScene:scene transition:transition];

}

更新

经过3天的挣扎,我发现我的不良做法是使用"窗帘"样式动画在场景之间导航。这种方法的问题在于窗帘"在屏幕的大小,和~30纹理的窗帘图集是巨大的,可能是导致内存运行如此之高的原因,我不知道为什么它会导致泄漏相似的行为,但是当减少帧数时在地图集里面到10左右,我不再看到内存那么高,而且看起来没有泄漏。

这种情况的另一个不好的做法是使用" preloadTextures:textures"方法,这种类型的动画似乎消耗了大量内存。当我删除它时,性能变得更好。

1 个答案:

答案 0 :(得分:1)

SK假设要自己解决所有问题,因为你有一个保留循环。但是我也遇到过这个问题。我的解决方案最终是手动将所有内容设置为nil:

-(void)willMoveFromView:(SKView *)view {

    // for all arrays
    [self.myArray removeAllObjects]; // and so on...

    // for all objects
    self.worldNode = nil;
    self.player = nil; // and so on...
}

正如您已经说过的,由于缓存会有一些增加,但您应该在某个时候进行调整。如果这不起作用,请尝试运行仪器以查看是否可以发现泄漏。