【问题标题】:Why do I have massive lag after running my spritekit scene a 4th time?为什么我在第四次运行我的 spritekit 场景后会有很大的延迟?
【发布时间】: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


【解决方案1】:

你基本上是在做你在 SpriteKit 中不应该做的事情。不建议在 SpriteKit 中使用多个视图控制器。

最好只有 1 个视图控制器和多个场景(菜单场景、游戏场景)。

你应该阅读这个问题。

Swift: How to handle view controllers for my game

【讨论】:

    【解决方案2】:

    嘿,我遇到了和你一样的问题。我将这行代码放在场景的末尾以返回到我的视图控制器,并且延迟消失了。

    self.viewController!.dismissViewControllerAnimated(true, completion: nil)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多