首页 > 解决方案 > “Dive Into SpriteKit”示例代码的性能问题

问题描述

我使用Paul Hudson 的 Dive Into SpriteKit 书中的分步教程与儿子制作了一个基本的 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 上都有完全相同的问题。

我们在 GitHub 上的完整实现

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

标签: timersprite-kit

解决方案


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

问题在于计时器(用于将节点添加到场景中)。计时器在 Run Loop 中运行,并且必须通过以下方式使其无效:

timer!.invalidate()

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

根据建议,我们对 SKAction 有了更多了解,另一种按时制造太空垃圾的方法似乎是:

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

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

removeAllActions()

推荐阅读