SceneKit帧速率不一致

Xzy*_*zya 11 scenekit swift metal xcode7

我在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运行.看起来第二部分有很多颜色加载/存储.

在此输入图像描述

Con*_*sed 7

不幸的是,它看起来像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上真正可能发生的事情导致了这个问题.