我有一个带按钮开始游戏的游戏菜单:
@IBAction func startGame(_ sender: AnyObject) {
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "gameViewController") as? GameViewController {
vc.modalTransitionStyle = .crossDissolve
self.present(vc, animated: true, completion: nil)
}
}
游戏代码:
if lifes == 0 {
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainMenuViewController") as? MainMenuViewController {
vc.modalTransitionStyle = .crossDissolve
self.present(vc, animated: true, completion: nil)
}
}
当用户点击按钮时,我会使用Sprite Kit场景显示新的视图控制器。但是当游戏结束时,我会回到菜单。如果我们再次点击开始游戏,fps会从60(在我的情况下)下降到30,然后再到20等等。好像旧视图控制器仍在工作。如何解雇?
我读过类似的问题,但没有找到答案。
答案 0 :(得分:1)
好的,现在你的问题很清楚了。
游戏结束时,您不应该展示新的MainViewController
。这将导致您可能无限堆栈的视图控制器,如下所示:
主要 - >游戏 - >主要 - >游戏 - > ...
相反,你应该解雇你的游戏vc并返回到前一个控制器,这样你内存中总会有一个或两个控制器。
所以你应该替换它:
if lifes == 0 {
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainMenuViewController") as? MainMenuViewController {
vc.modalTransitionStyle = .crossDissolve
self.present(vc, animated: true, completion: nil)
}
}
有了这个:
if lifes == 0 {
dismiss(animated: true, completion: nil) //will bring you to previous Main vc
}
修改强>
如果要显示两个以上的控制器,则应考虑导航控制器方法。基本上你用rootViewController(MainVC)创建它,然后推送GameVC,然后推送GameOver。
在MainVC中:
self.navigationController?.pushViewController(gameVC, animated: true)
在GameVC中:
self.navigationController?.pushViewController(gameOverVC, animated: true)
仅弹出一个控制器:
self.navigationController?.popViewController(animated: true)
弹出到第一个控制器:
self.navigationController?.popToRootViewController(animated: true)