不一致的 SceneKit 帧率

Inconsistent SceneKit framerate

我在 SceneKit 入门项目中发现帧速率非常不一致。有时它以 60 fps(12 毫秒渲染,6 毫秒金属冲洗)持续运行,有时它以 40 fps(20 毫秒渲染,6 毫秒金属冲洗)持续运行,不多也不少。

当我重新打开应用程序时,帧率会随机变化,并且会保持该帧率直到下一次重新打开。我尝试切换到 OpenGL ES,虽然它似乎在入门项目中修复了它,但我仍然在我的真实应用程序中看到这些问题。

启动项目未修改(旋转船),我正在 Xcode 7.0 和 iPad Mini 4 运行 iOS 9.0.1 上对其进行测试。我不确定是什么导致了问题,SceneKit,iOS 或我的设备。

编辑:这是一个金属系统跟踪,第一部分是 运行 60fps,第二部分我按下主页按钮并重新打开应用程序,它以 40fps 运行。第二部好像有很多颜色load/stores。

不幸的是,SceneKit(和 SpriteKit)看起来正处于发展的进化阶段,以牺牲使用它们的人为代价。

这个问题肯定存在于我所知道的所有设备和以下框架上:

  • SceneKit
  • SpriteKit
  • 金属

即使在游戏框架中使用 OpenGL 而不是 Metal,问题仍然存在,而且一致性没有降低。

如果 iOS 确定维持稳定的 60fps 存在问题,则 iOS 似乎尝试将帧速率固定为 40fps。

我认为下降到 40fps 的原因是 iOS 不太擅长解释 "problems",并且在应用程序启动的不稳定点进行性能采样的时间太短,考虑到许多误报的问题,一旦 iOS 本身实际上已经安定下来并让 app/game 运行 没有障碍。

jetFighter 的默认模板在 60fps 下 运行 应该不会有问题。因此,如果 iOS 决定何时将游戏循环限制在 40fps 的轮询在发布时过早完成,时间过短,那么帧率上限 "feature" 才会生效才有意义.这意味着游戏前几帧的任何中断都会导致 iOS 将其限制在 40fps,先发制人地认为游戏不会t/can保持 60fps。

具有讽刺意味的是,iOS 可能是它在游戏启动时检测到的问题导致它认为应用无法保持稳定的 60fps 的原因。

但我在猜测!

这是基于观察,而不是关于此事的任何已知事实。但这与我所看到的情况一致,也是我目前唯一合理的解释。

"good news"是iOS不是只采样一次就离开了。它会间歇性地对游戏进行采样,并且在出现中断(例如跳出主屏幕并返回应用程序)之后。

例如:可以通过 iOS 对帧率进行重新采样,并使其从 40 跳到 60,或从 60 跳到 40,只需在连接设备时启动 Quicktime screenCapture。显然,这(以及其他一些操作)将导致 iOS 再次测试 运行ning 应用程序的帧率一致性,然后 iOS 再次根据其发现进行调整。

并且,在任意时间后,它会再次扫描。如果您离开 JetFighter 模板 运行ning 一段时间,您还会看到最终 iOS 对帧率一致性进行了另一项测试,并且通常确定它现在在 60fps 下足够稳定以将其放回原处高达 60fps,尽管最初决定它应该只 运行 在 40fps。

我说这一切是因为我在设备的统计数据中看到了一个叫做 "renderer" 的东西,它故意在每个游戏循环中占用恰到好处的额外时间来强制 40fps,即使没有任何地方足够多的其他事情正在发生,使之成为必要。

我突然想到,Apple 正在根据他们关于 iPad Pro 的声明开发可变帧率技术,并且 iOS 支持的功能已经(似乎)提前实现屏幕技术的发布,以及糟糕而奇怪的测试 运行ning 应用程序以确定何时强制将它们降低到较慢的帧速率。

鉴于 40fps 是一个奇数,不能均分当前设备 60fps 刷新率下的默认刷新率,如果他们如此感兴趣,iPad Pro 很可能能够进行 120Hz 屏幕刷新每秒 40 帧。

从当前 iPads 捕获时,如果帧速率被 iOS 锁定在 40fps,我会看到一个 2:1:2:1:2:1 帧序列,这就是您在 60Hz 上制作 40fps 的方式刷新设备。

这绝不是理想的。你永远不会想在 60Hz 屏幕上看到这个,因为它在视觉上很烦人,即使对于眼睛不敏感的人也是如此。

可能这种可变帧率技术在新 iPhone 上允许真正的 40fps,我不知道。还没有看到任何经过测试的东西,但目前只有 iPad Pro 才能真正实现的东西在所有方面都导致了这个问题,这似乎很奇怪。