关闭 SKScene 后,内存仍然很高
Posted
技术标签:
【中文标题】关闭 SKScene 后,内存仍然很高【英文标题】:After Closing SKScene, Memory Remains High 【发布时间】:2014-05-07 09:45:25 【问题描述】:我使用 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 中删除它并没有多大作用。
【问题讨论】:
我认为在一个 iOS 项目中管理多个 SKView 不是一个好主意,即使你正在替换视图。一个原因是各种资源缓存可能与视图相关联,并且换出视图可能代价高昂(无论是性能还是内存消耗)。而是使用单个视图并使用场景转换来更改场景。这就是 Sprite Kit 的用途。 【参考方案1】: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];
【讨论】:
谢谢。我已经阅读了这些主题。并且该修改导致应用程序崩溃:[UIView presentScene:]: unrecognized selector sent to instance【参考方案2】:将NSLog()
放入SKScene
的dealloc
方法以确保它正在释放。
此外,在场景的引用计数达到 0 后,资源可能不会立即释放。由于内部优化,资产可能会保留在内存中,直到收到内存警告信号。
【讨论】:
以上是关于关闭 SKScene 后,内存仍然很高的主要内容,如果未能解决你的问题,请参考以下文章