我使用dispatch_onceNSObject创建数据指针。因此,当主视图控制器出现时,所有游戏资源指针都会被创建。为了玩游戏,用户点击UIButton对应于某个特定级别UI视图控制器。让我称之为 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)时,内存仍然很高。游戏需要大量的资源。所以当游戏开始时,内存使用量会跳到200MB。当用户返回到原始关卡选择视图控制器时,游戏模拟器仍然消耗 200 MB(根据活动监视器。当用户进入不同的级别时,内存使用量将再跳10 MB。那么当用户离开 SKScene 后,如何释放上一场游戏的内存呢?
我正在使用ARC。 Xcode 版本是 5.1。开发目标是iOS 7.1。
感谢您的帮助。
-- 编辑1 --
我太愚蠢。我知道问题是什么。当我关闭场景时,我将创建一个新的 SKView,然后将其设置为 nil 以退出当前场景。有用。但这不应该是这样做的方式。相反,我需要在呈现当前 SKView 之前将其设置为变量。当我关闭场景时,我需要将该变量设置为零。嗯……我没有多想。
-- 编辑2 --
当前场景呈现 nil 时几乎没有变化。从removeFromSuperview 中删除它并没有多大作用。
SO 上的一些人注意到,当包含的 SKView 从其超级视图中删除时,SKScene 会被释放。
看看这些问题及其答案:
在 SpriteKit 中转换到另一个 SKScene 后释放 SKScene https://stackoverflow.com/questions/22007391/deallocate-skscene-after-transition-to-another-skscene-in-spritekit/22528395#22528395
iOS 7 Sprite Kit 释放内存 https://stackoverflow.com/questions/19251337/ios-7-sprite-kit-freeing-up-memory
另外,尝试修改 closeScene 方法,如下所示:
- (void)closeScene {
SKView *spriteView = (SKView*)self.view;
[spriteView presentScene:nil];
[self.navigationController popViewControllerAnimated:YES];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)