“深入SpriteKit”示例代码出现性能问题

时间:2019-06-27 16:06:53

标签: timer sprite-kit

我和儿子一起使用Dive Into SpriteKit book by Paul Hudson中的分步教程制作了一个基本的SpriteKit游戏。

该游戏只是一个SKScene,可以绘制船只,一堆太空垃圾并提供基本控制。游戏结束后,我们将按照书中的说明进行操作:

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    if let scene = GameScene(fileNamed: "GameScene") {
        scene.scaleMode = .aspectFill
        self.view?.presentScene(scene)
    }
}

不幸的是,随着每个新游戏场景的出现,FPS都会下降,并且在我的iPad上出现20多个游戏结束后,游戏将无法播放。我猜有些东西没有正确初始化,但是我不确定在哪里查找以及如何解决这个问题。

我从书中检查了“规范”实施,它们在iOS 12上都有完全相同的问题。

我们的complete implementation on GitHub

我将感谢有关如何管理场景生命周期以保持性能的建议。

1 个答案:

答案 0 :(得分:0)

感谢@ 0x141E提供解决方案和建议!

问题出在计时器上(用于将节点添加到场景中)。计时器在“运行循环”中运行,并且必须使用以下命令使其无效:

timer!.invalidate()

在GameOver中为这两个计时器添加了无效性,从而解决了主要的性能下降问题以及内存泄漏。

根据建议,我们了解了更多有关SKAction的知识,按计划创建太空垃圾的另一种方法似乎是:

run(SKAction.repeatForever(SKAction.sequence([
    SKAction.run(createEnemy),
    SKAction.wait(forDuration: 0.45)
    ])))

在这种情况下,我们仍然需要确保停止GameOver中的所有动作。

removeAllActions()