SceneKit帧速率不一致

时间:2015-09-28 10:41:18

标签: swift xcode7 scenekit metal

我在SceneKit启动项目中看到非常不一致的帧速率。有时它以60 fps(12ms渲染,6ms金属冲洗)持续运行,有时它以40 fps(20ms渲染,6ms金属冲洗)不断运行,不多也不少。

当我重新打开应用程序时,帧速率随机变化,并将保持该帧速率,直到下次重新打开。我尝试切换到OpenGL ES,虽然它似乎在初学者项目中修复它,但我仍然在我的真实应用程序中看到这些下降。

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

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

enter image description here

1 个答案:

答案 0 :(得分:6)

不幸的是,它看起来像SceneKit(和SpriteKit)处于发展阶段,牺牲了那些使用它们。

这个问题绝对适用于所有设备,以及我所知道的以下框架:

  • SceneKit
  • SpriteKit
  • 金属

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

如果iOS确定存在稳定的60fps问题,那么iOS似乎是尝试将帧速率修复为40fps。

我认为下降到40fps的原因是iOS在解释“问题”方面不是很擅长,并且在应用程序发布的不稳定点进行性能采样的时间太短,给出了很多误报一旦iOS本身已经安定下来并让应用程序/游戏顺利运行,就不存在了。

使用jetFighter的默认模板不应该以60fps的速度运行。因此,只有在iOS上进行轮询以确定何时以40fps限制游戏循环时,这个帧速率上限“功能”才会变得活跃,这在发布时太早,太短时间内完成。这意味着游戏的前几帧中断会导致iOS以40fps的速度上限,先发制人地认为游戏不会/不能保持60fps。

具有讽刺意味的是,iOS可能是它在游戏发布时检测到的打嗝的原因,导致它认为该应用程序无法保持稳定的60fps。

但我正在猜测!

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

“好消息”是iOS不会只采样一次并离开它。它会以痉挛的方式对游戏进行抽样调整,并在中断之后跳出主屏幕并返回应用程序。

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

并且,在任意一段时间后,它再次扫描。如果你让JetFighter模板运行一段时间,你也会看到iOS最终会对帧速率的一致性进行另一次测试,并且经常确定它现在足够稳定在60fps以使它恢复到60fps,尽管最初决定它应该只能以40fps运行。

我说这一切都是因为我在设备上的统计数据中看到了一个名为“渲染器”的东西故意在每个游戏循环中占用恰当数量的额外时间以强制40fps,即使在其他任何地方都没有足够的东西继续做有必要。

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

鉴于40fps是一个奇数,并没有以60fps的刷新率同等地划分为当前设备的默认刷新率,如果他们对40fps如此感兴趣,iPad Pro很可能能够进行120Hz的屏幕刷新。

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

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

可能这种可变帧速率技术允许在新款iPhone上实现真正的40fps,我不知道。还没有看到任何经过测试的东西,但似乎很奇怪的是,iPad Pro上真正可能发生的事情在目前的所有事情上都会引发这个问题。