closuresSKScene后,内存仍然很高
我使用dispatch_once NSObject来创build数据指针。 所以所有的游戏资产指针都是在主视图控制器出现的时候创build的。 为了玩游戏,用户点击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。 当用户返回到原始级别select视图控制器时,根据活动监视器 ,游戏模拟器仍然消耗200 MB。 当用户input不同的级别时,内存使用量将会跳过另外10 MB。 那么一旦用户离开SKScene,我怎么能释放上一场比赛的内存呢?
我正在使用ARC。 Xcode版本是5.1。 开发目标是iOS 7.1。
感谢您的帮助。
– 编辑1 –
我太愚蠢。 我知道问题是什么 当我closures这个场景时,我正在创build一个新的SKView,然后我将它设置为零来摆脱当前场景。 有用。 但是,这不应该是这样做的方式。 相反,我需要在呈现之前将当前的SKView设置为一个variables。 当我closures场景时,我需要将该variables设置为零。 嗯…我没在想。
– 编辑2 – 当前场景显示为零时几乎没有变化。 从removeFromSuperview删除它没有太大的作用。
在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]; }
把NSLog()
放到SKScene
的dealloc
方法中,确保它是释放的。
另外,在场景的引用次数达到0之后,可能不会释放资源。由于内部优化,资源可能会一直保留在内存中,直到收到内存警告信号。
- 应用程序尝试模式地呈现一个主动控制器 – 崩溃,为什么?
- Xcode 6:在Fabric Crashlytics更新后找不到’Answers.h’文件
- Swift尝试呈现其视图不在窗口层次结构中的UIAlertController(在TWTRShareEmailViewController之后呈现)
- 在Swift中断言以及为什么要使用它们
- 获得无限 – 通过paulirish滚动在iPhone上工作
- 不一致的Unicode表情符号字形/符号
- UIScrollView setContentSize使用未捕获的NSRangeException崩溃
- 以编程方式创建ViewController时,如何将其视图设置为SKVIew类型?
- 将iPad应用程序转换为iPhone?