timer - “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 上都有完全相同的问题。
我将感谢有关如何管理场景生命周期以保持性能的建议。
解决方案
感谢@0x141E 的解决方案和建议!
问题在于计时器(用于将节点添加到场景中)。计时器在 Run Loop 中运行,并且必须通过以下方式使其无效:
timer!.invalidate()
在 GameOver 中为两个计时器添加失效解决了主要的性能下降问题以及内存泄漏。
根据建议,我们对 SKAction 有了更多了解,另一种按时制造太空垃圾的方法似乎是:
run(SKAction.repeatForever(SKAction.sequence([
SKAction.run(createEnemy),
SKAction.wait(forDuration: 0.45)
])))
在这种情况下,我们仍然需要确保我们确实停止了 GameOver 中的所有动作。
removeAllActions()
推荐阅读
- php - PHP如何从大文本文件中删除行集而不留下空行
- javascript - 放置 DOM 元素
- shell - 使用 awk 生成 xml
- c# - 获取 Sql Developer 的版本,如果是该版本的第一次在该机器上执行
- java - NavigationalView 未知颜色
- java - 获取“交易未成功启动”
- spring - Spring MVC 动态配置获取 404 但与 MockMVC 一起使用
- c++ - 出现数学错误试图计算天然气的基本价格
- azure - Azure 静态网站托管优于 Azure CDN 有什么好处
- angularjs - Highcharts 图表不随 Firebase 更新