【发布时间】:2016-08-23 17:19:10
【问题描述】:
我正在开发一个同时使用 ViewController 和 SpriteKit 场景的 spritekit 游戏。基本上,应用程序的结构是您打开一个菜单(视图控制器),通过一个按钮按下模态地将您转到加载 GameScene(skscene)的游戏(视图控制器)。
当您输掉比赛时,您会通过模态转场进入游戏结束屏幕(视图控制器):gameVC?.performSegueWithIdentifier("goToGameOver", sender: gameVC) 此转场位于 GameScene 中,scene.gameVC = self 位于游戏视图控制器中。 gameVC 在 GameScene 中被初始化为 var gameVC: UIViewController?。在游戏结束屏幕中,您可以返回菜单,也可以使用按钮初始化的模态转场再次播放(返回游戏视图控制器)。
当您访问 GameScene 超过四次时会出现此问题。 GameScene 第五次打开(无论是从菜单 vc 还是从 vc 上的游戏),游戏都非常滞后。屏幕右下角的 fps 计数器显示游戏产生 1.5 fps。
我认为问题在于 GameViewController 和 GameScene 没有被正确关闭(应用程序每次移动到 GameScene 时,应用程序的内存使用量都会增加),但我不知道如何正确关闭它们。我用过
self.removeFromParent()
self.view?.presentScene(nil)
作为尝试在运行到 GameOver 代码的 segue 之前和之后关闭 GameScene 的一种方式,但无济于事。我也想到了 unwind segue,但我无法放松到我还没有去过的视图控制器(游戏结束)。我完全没有想法,这是一个破坏游戏的错误。我真的很感激一些帮助。非常感谢。
【问题讨论】:
-
可能因为没有什么东西会死掉,所以您需要研究可能发生的强保留周期。在你的类文件中声明
deinit并在其中放置一个打印语句以确保它们被调用 -
在我从一个游戏切换到另一个游戏之前,我会使用
self.removeAllChildren()和 `self.removeAllActions()' - 这是否回答了强大的保留周期? -
不,这根本没有帮助,因为那些应该与父母一起死,自我内部的东西正在坚持自我
-
当你说'self is holding on self'时,你是说GameViewController中的某些东西即使在转换到GameOverViewController之后仍然引用scene.gameVC?我还使用 Instruments 检查了内存泄漏,虽然它说没有任何泄漏,但每次加载 GameScene 时使用的内存都会增加。
-
自我可能意味着任何东西。无论实例没有死亡,它内部的某些东西都会抓住它
标签: ios swift uiviewcontroller sprite-kit