9

我使用 dispatch_once NSObject来创建数据指针。所以所有的游戏资源指针都是在主视图控制器出现的时候生成的。为了玩游戏,用户在UIViewController上点击对应于特定级别的UIButton。让我称之为LevelSelectionController。游戏结束后,用户将点击一个标签 ( SKLabel )。并且所有动作和节点都将被删除。

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

此外,特定关卡的SKScene子类将返回用户到 LevelSelectionController 的任务委托给呈现游戏SKView的视图控制器,如下所示。

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

我唯一的问题是当用户离开游戏场景(SKScene)时内存仍然很高。游戏需要大量资产。所以当游戏开始时,内存使用会跳到 200 MB。当用户返回到原来的关卡选择视图控制器时,根据Activity Monitor,游戏模拟器仍在消耗 200 MB 。当用户进入不同的关卡时,内存使用量将再跳跃 10 MB。那么一旦用户离开SKScene,如何释放最后一场比赛的内存呢?

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

谢谢您的帮助。

-- 编辑 1 --

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

-- 编辑 2 -- 当前场景以 nil 呈现时几乎没有变化。从 removeFromSuperview 中删除它并没有多大作用。

4

2 回答 2

2

SO 上的一些人已经注意到,当包含的 SKView 从其超级视图中删除时,SKScene 会被释放。

看看这些问题及其答案:

转换到 SpriteKit 中的另一个 SKScene 后解除分配 SKScene

iOS 7 Sprite Kit 释放内存

另外,尝试像这样修改 closeScene 方法:

- (void)closeScene {
    SKView *spriteView = (SKView*)self.view;
    [spriteView presentScene:nil];
    [self.navigationController popViewControllerAnimated:YES];
}
于 2014-03-28T08:40:26.860 回答
0

放入NSLog()toSKScenedealloc方法以确保它正在释放。

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

于 2014-03-28T05:13:29.067 回答