SceneKit 帧速率不一致

Posted

技术标签:

【中文标题】SceneKit 帧速率不一致【英文标题】:Inconsistent SceneKit framerate 【发布时间】:2015-12-25 13:54:36 【问题描述】:

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

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

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

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

【问题讨论】:

您的设备目标是否仅适用于 iPhone,并且您只是在 iPad 上进行测试?因为我一直在开发一款只针对 iPhone 的游戏,当我在 iPad 上测试它时,我也收到了 40 fps。但是,一旦我将设备目标更改为通用,iPad 就一直保持在 60 fps。 @Jarron 它实际上是一个仅 iPad 的项目。浏览了苹果论坛,这似乎是一个已知的错误。 @Xzya 你有链接到讨论而不是苹果论坛吗?我看到帧速率从 60 fps 开始,然后慢慢下降到 50 秒以下。 【参考方案1】:

不幸的是,SceneKit(和 SpriteKit)似乎处于发展的进化阶段,牺牲了使用它们的人的利益。

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

场景工具包 SpriteKit 金属

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

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

我认为下降到 40fps 的原因是 iOS 不太擅长解释“问题”,并且在应用启动的不稳定点上进行性能采样的时间太短,因为存在许多误报的问题一旦 iOS 本身真正安定下来并让应用程序/游戏畅通无阻地运行,它们就不存在了。

jetFighter 的默认模板以 60fps 运行应该不会有问题。因此,如果 iOS 轮询确定何时将游戏循环限制在 40fps 的时间过早且时间过短,那么这个帧速率上限“功能”才有意义。这意味着游戏前几帧的任何中断都会导致 iOS 将其限制在 40fps,先发制人地认为游戏不会/无法保持 60fps。

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

但我在猜测!

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

“好消息”是 iOS 不会只采样一次就离开它。它会间歇性地对游戏进行采样,并在跳出主屏幕并返回应用程序等中断之后。

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

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

我之所以这么说,是因为我在设备的统计数据中看到了一个名为“渲染器”的东西,它故意在每个游戏循环中占用恰到好处的额外时间来强制 40fps,即使其他东西还远远不够继续做这件事。

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

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

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

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

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

【讨论】:

似乎确实如此。仔细观察轨迹,2:1:2:1 图案清晰可见i.imgur.com/DUEI0A3.png

以上是关于SceneKit 帧速率不一致的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pandas 多索引数据帧切片看起来不一致?

如何使用 Android CameraX ImageAnalysis 提高帧速率?

以恒定帧速率捕获网络摄像头视频的方法?

# WPF动画速率效果

运行之间的 Spark DataFrame 行数不一致

XNA Sprite 帧不一致