我制作了一个包含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"方法,这种类型的动画似乎消耗了大量内存。当我删除它时,性能变得更好。
答案 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...
}
正如您已经说过的,由于缓存会有一些增加,但您应该在某个时候进行调整。如果这不起作用,请尝试运行仪器以查看是否可以发现泄漏。