【发布时间】:2015-10-24 17:20:37
【问题描述】:
我正在开发一个小型 SpriteKit 游戏,该游戏涉及通过生成的一系列级联门来操纵玩家 SKSpriteNode:
为了防止帧速率随时间下降,我在 GameScene 的更新函数中实现了一个简单的代码块:
for node in children {
if(node.position.y < -100) {
if(node.name == "player") {
switchMode(2)
}
node.removeFromParent()
}
游戏以完美的 60 fps 开始,并在该状态下保持几分钟。
出乎意料的是,游戏在 iPhone 5c 上运行大约 2-3 分钟后出现帧率下降,并且在 4 分钟左右后游戏下降到无法播放的 12 fps。查看我的代码,在更新循环中随着时间的推移并没有发生太多其他事情,所以这种行为很奇怪。有趣的是,当游戏丢失并调用 GUI 游戏时,帧速率会恢复到 60 fps,但会根据游戏运行的时间恢复到较慢的 FPS。
我怀疑屏障的 SKNode 不知何故没有被正确删除,可能是附加到门 SKSpriteNode 实例的 SKPhysicsBody 实例保持活动状态并给 CPU 带来压力。我可以/需要做些什么来显式删除 SKSpriteNode 实例的 .physicsBody 属性以将它们从物理计算中删除?我尝试在删除过程中设置 .physicsBody = nil,但没有帮助。
我在 OS X 10.11.1 上运行 Xcode 7.1,在运行 iOS 9 的 iPhone 5c 上测试我的应用程序。
【问题讨论】:
-
如果您正在观看 FPS,那么我假设您已将
skView.showsFPS设置为YES。您是否也启用了.showsDrawCount和.showsNodeCount? -
@Thunk as 在屏幕截图中可见,.showsFPS 和 .showsNodeCount 已启用,但 .showsDrawCount 未启用。此外,SKView 显示的节点数只是屏幕上的节点数。几天前我对 children.count 进行了一些监控,看来 SKNode 已成功删除。
-
请原谅,
children是什么?你从那个数组中删除你的节点吗?如果该阵列不断建立,则可能会导致速度变慢,因为必须每秒循环通过所有阵列 60 次。性能方面的另一件事是,大约每秒检查一次children(如果需要,可能会更快)。 -
@Gliderman 我的错,我忘了澄清。 children 是 GameScene 下的 SKNode 实例,我已经设法按预期将数组大小保持在较低水平。
标签: ios iphone swift sprite-kit frame-rate