所以我已经阅读了几个有关此问题的问题,但大多数是在Objective-C中,我还没有找到任何直接解决/回答的问题。 我是新手编程,所以请彻底解释任何建议。
我需要了解如何在游戏结束后取消分配我的GameScene。我需要这样做的原因是因为在比赛结束后,我转换到新的SKScene(场景中的游戏),当我转换回我的GameScene时,GameScene都没有完全重置或者我正在生成一个新的GameScene每一次。
我这样说是因为每次游戏结束时我的每秒帧数都会下降并转换回GameScene,所以如果我做足够多次,我甚至不能再玩游戏了。这是一个问题。
我不明白为什么会发生这种情况,因为当我在场景中过渡到我的游戏时,我会删除GameScene中的所有内容:
self.viewController!.performSegueWithIdentifier("goToGameOver", sender: nil)
self.removeAllChildren()
self.removeAllActions()
self.scene?.removeFromParent()
我还在这里阅读:After Closing SKScene, Memory Remains High删除包含SKScene的SKView会解除分配SKScene,所以当我的GameScene和场景游戏都离开时,我会从他们的超级视图中删除两个视图:
override func viewDidDisappear(animated: Bool) {
print("its gone")
self.view.removeFromSuperview()
}
但是对于每秒减少的帧数并没有任何影响,游戏仍然滞后。我不明白我没做什么,无法判断场景中的游戏是否是问题,或者我只是不解除GameScene的解除分配。
如何取消分配GameScene?我还应该做什么?
编辑:
每次转换回GameScene时,我的节点数和绘制计数大致相同,所以这似乎不是问题。我尝试在GameScene类中使用它来测试在场景之间转换时是否调用了deinit
(之前我没有deinit
):
} //<**End of GAMESCENE**
deinit {
print("Deinit was called")
}
没有打印任何内容,因此deinit
没有被调用。
编辑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
。在没有被召唤的情况下离开。
答案 0 :(得分:0)
在我的项目中,我使用了以下机制并且运行良好。我的所有场景SKScene
对象都是可选变量。当我需要显示新场景时,我创建它并出现在SKView
。当我需要显示新场景时,我将前一个对象场景对象设置为nil
,这会立即将引用计数减少1,因此此时没有一个对象不使用我的场景,引用计数变为零并且场景被删除。
SKScene
对象是普通的类对象,ARC
与所有引用类型对象一样使用它们。您只需要监视场景的引用数量。所有这些都完成了我在deinit
对象<{p>}的SKScene
开始的各种资源
简单的例子:
在UIViewController
,我们有GameScene
的可选对象:
class GameViewController: UIViewController {
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)
scene = nil
}
override func viewDidLoad() {
super.viewDidLoad()
// Create GameScene object
scene = GameScene(fileNamed:"GameScene")
skView = (self.view as! SKView)
skView!.showsFPS = true
skView!.showsNodeCount = true
skView!.ignoresSiblingOrder = true
scene!.scaleMode = .AspectFill
// Present current scene
skView!.presentScene(scene)
}
}
在GameScene
deinit
打印一些文字,以表明该对象将被删除:
class GameScene: SKScene {
...
deinit {
print("Deinit scene")
}
}
按下nextSceneAction
按钮后调试输出:
下一个场景
Deinit scene