【发布时间】:2015-02-03 18:46:01
【问题描述】:
我正在使用 SpriteKit 编写一个 iOS 游戏。在游戏过程中,显然是随机的,帧速率将从 60 FPS 下降到 40 FPS(始终为 40)。我在 iPhone 6 上运行它。在构建发布和调试时存在该错误。
我通常一次在屏幕上大约有 30 个节点(有时更少),其中大多数节点都有物理体,但是,除了大约 5 个之外,所有节点都将 dynamic 设置为 NO。前面提到的物理体不会相互碰撞,但是它们会与玩家节点发生碰撞。玩家节点移动速度不快,通常一次只接触大约 5 个左右的节点。当玩家节点与其他一些物理体接触时,它们的dynamic 属性设置为YES。
可能还值得一提的是,我有几个UIViews 和UIImageViews 覆盖在SKView 的顶部,充当HUD。
令我震惊的是,这不是一个特别密集的模拟。我已经检查了我的 - update: 方法、操作、联系侦听器等,但没有发现任何可能导致这种情况的东西。我在 Instruments (Time Profiler) 中度过了最后几天,希望它能对此事有所启发,但同样,我没有发现任何让我感到震惊的东西。但是,我承认我对 Instruments 还很陌生。
目前,我无法重现该错误。我只需要玩游戏,希望能遇到它。有时它会在场景加载时发生(非常罕见),只是在正常游戏过程中,或者根本不发生。如果我暂停游戏(暂停视图和场景)并恢复它,帧速率就会恢复。有时帧率会在几秒钟后恢复正常。我完全不知道在这里做什么。任何帮助将不胜感激。
提前致谢。
【问题讨论】:
-
您是否尝试过重新启动手机,并在未连接调试器的情况下运行应用程序? (拔下电缆)并尝试不使用 UIView 组件进行测试,因为它们可能会干扰,尤其是如果您有几个。
-
删除 UIKit 项目作为测试当然没有什么坏处。您可以做的另一件事,只是为了“验证”,就是添加一些代码来测量更新之间的间隔。看看它们的一致性。
-
@MobileBen 嗨,Ben,刚刚删除了所有 UIKit 项目(包括
UIButtons)。不想说得太早,但这似乎已经解决了问题。将进行更多测试(不敢相信:))并报告。回覆。你的第二条评论。我没有使用任何纹理。你能解释一下“广义的抽签顺序”是什么意思吗? -
如果你发现 UIKit 有问题,那么我建议你看看你是否能找到 SpriteKit 的“等价物”。例如,我所有的按钮实际上都是 SpriteKit 按钮,它们的行为大致类似于 UIKit 按钮。
-
UIViews 的问题是它们不是“实时友好的”,有些(UIScrollView)比其他的少。例如,众所周知,在滚动视图中滚动会冻结或降低 OpenGL 视图的 fps,或者由于 OpenGL 视图使用过多资源和 CPU 时间(在同一线程上)而导致滚动视图“跳跃”。取决于游戏循环的实现方式。如果 UIView 是 SKView 的子级,或者它们是否是兄弟姐妹(即都将 UIWindow 作为父视图),这也可能会有所不同。
标签: ios performance sprite-kit frame-rate