所以我读过几个关于这个问题的问题,但大多数都是 Objective-C 的,我还没有找到任何直接解决/回答这个问题的问题。
我是这里编程的新手,所以请彻底解释任何建议。
我需要了解如何解除分配游戏结束后我的游戏场景到达。我需要这样做的原因是因为游戏结束后,我过渡到一个新的 SKScene(游戏结束场景),当我过渡回我的 GameScene 时,要么 GameScene 没有完全重置,要么我每次都会生成一个新的 GameScene 。
我这么说是因为每次游戏结束并转换回 GameScene 时,我的每秒帧数都会下降,因此,如果我这样做的次数足够多,我什至无法再玩游戏了。这是个问题。
我不明白为什么会发生这种情况,因为当我过渡到游戏结束场景时,我从 GameScene 中删除了所有内容:
self.viewController!.performSegueWithIdentifier("goToGameOver", sender: nil)
self.removeAllChildren()
self.removeAllActions()
self.scene?.removeFromParent()
我还在这里读到:关闭SKScene后,内存仍然居高不下 https://stackoverflow.com/questions/22704219/after-closing-skscene-memory-remains-high删除包含 SKScene 的 SKView 会取消分配 SKScene,因此当我的 GameScene 和游戏结束场景都保留时,我会从其超级视图中删除这两个视图,如下所示:
override func viewDidDisappear(animated: Bool) {
print("its gone")
self.view.removeFromSuperview()
}
但每秒帧数的减少并没有任何影响,游戏仍然滞后。我不明白我没有做什么,也无法判断游戏结束场景是否是问题所在,或者我只是没有取消分配 GameScene。
如何释放 GameScene?我还应该做什么?
EDIT:
每次我转换回 GameScene 时,我的节点数和绘制数都保持大致相同,因此这似乎不是问题。我尝试测试是否deinit
在场景之间转换时被调用(我没有deinit
之前)在 GameScene 类中使用它:
} //<**End of GAMESCENE**
deinit {
print("Deinit was called")
}
并且没有打印任何内容deinit
没有被调用。
EDIT 2:
@alex_p 这是我的 GameViewController 中的内容 -
class GameViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
var scene1: GameScene?
var scene2: GameScene?
var skView: SKView?
// Action to present next Scene
@IBAction func nextSceneAction(sender: AnyObject) {
print("Next scene")
// Create new GameScene object
scene2 = GameScene(fileNamed:"GameScene")
// Present scene2 object that replace the scene1 object
skView!.presentScene(scene2) //ERROR ON THIS LINE
scene1 = nil
}
我从 GameScene 中调用这个方法,如下所示:
self.viewController.nextSceneAction(self)
我完全复制了你的,但收到错误unexpectedly found nil while unwrapping an Optional value
在上面评论的线上。 Deinit 没有被调用。