关闭SKScene后,内存仍然很高

时间:2014-03-28 04:29:56

标签: ios objective-c sprite-kit skscene skview

我使用dispatch_once NSObject 来创建数据指针。因此,当主视图控制器出现时,所有游戏资产指针都会生成。为了玩游戏,用户点击 UIViewController 上与特定级别相对应的 UIButton 。我叫它LevelSelectionController。当游戏结束时,用户将点击标签( SKLabel )。并且将删除所有操作和节点。

[self removeAllActions];
[self removeAllChildren];
[self removeFromParent];

此外,特定级别的 SKScene 子类将用户返回LevelSelectionController的任务委托给呈现游戏 SKView 的viewcontroller,如下所示。

- (void)closeScene {
    SKView *spriteView = [[SKView alloc] init];
    [spriteView presentScene:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

我唯一的问题是当用户离开游戏场景(SKScene)时内存仍然很高。游戏需要大量资产。因此,当游戏开始时,内存使用量将跳至200 MB。当用户返回到原始级别选择视图控制器时,根据活动监视器,游戏模拟器仍然消耗200 MB。当用户进入不同级别时,内存使用量将再跳过10 MB。那么一旦用户离开SKScene,我怎样才能释放上一场比赛的内存?

我正在使用ARC。 Xcode版本是5.1。开发目标是iOS 7.1。

感谢您的帮助。

- 编辑1 -

我很傻。我知道问题是什么。当我关闭场景时,我正在创建一个新的SKView,然后我将其设置为nil以获取当前场景。有用。但这不应该是这样做的方式。相反,我需要在呈现之前将当前SKView设置为变量。当我关闭场景时,我需要将该变量设置为nil。嗯......我没在想。

- 编辑2 - 当前场景以零显示时几乎没有变化。从removeFromSuperview中删除它并没有太大作用。

2 个答案:

答案 0 :(得分:2)

一些人在SO上注意到,当从其超级视图中删除包含SKView时,SKScene会被解除分配。

看看这些问题及其答案:

Deallocate SKScene after transition to another SKScene in SpriteKit

iOS 7 Sprite Kit freeing up memory

另外,尝试修改closeScene方法,如下所示:

- (void)closeScene {
    SKView *spriteView = (SKView*)self.view;
    [spriteView presentScene:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

答案 1 :(得分:0)

NSLog()置于SKScene的{​​{1}}方法,以确保它已取消分配。

此外,在场景的引用计数达到0之后,资源可能不会被释放。由于内部优化,资产可能会留在内存中,直到收到内存警告信号。