SpriteKit- didfinishupdate和下一个更新(在场景渲染期间)之间的游戏滞后



update 我删除了在应用程序中运行的大多数过程,但仍然观察到这些"滞后"。因此,我尝试了一个新项目(SpriteKit演示项目带有Xcode 8并记录了框架时间。即使在这里,框架也滞后。请参阅以下图片:SpriteKit Demo的框架时间。至少这对我的效果没有效果。游戏,这并不能使调试变得更容易..: -/

您可以观察到相同的效果吗?您可以简单地使用以下代码记录时间:

var cycleStart = Date().timeIntervalSince1970
var cycleEnd = Date().timeIntervalSince1970
var lastTime = TimeInterval()
var delta = TimeInterval()
override func update(_ currentTime: TimeInterval) {
    delta = currentTime - lastTime
    lastTime = currentTime
    print("(delta) (cycleEnd-cycleStart)")
    cycleStart = Date().timeIntervalSince1970
}
override func didFinishUpdate() {
    cycleEnd = Date().timeIntervalSince1970
}

我仍然想知道为什么滞后框架持续时间跳到33ms。这是SpriteKit的工作方式吗?我的意思是,如果不是所有的过程都可以及时完成,而不是按完成所有过程所需的时间延长单个框架持续时间?

原始问题我的SpriteKit游戏偶尔会滞后。不幸的是,到目前为止,我无法识别任何可能导致滞后的功能或过程。因此,我试图通过测量整个场景处理过程中经过的时间来缩小范围。请查看图:绘图:总帧时间与更新 -> didfinishupdate

i绘制了输入update()函数之间经过的时间,直到didfinishupdate()调用(橙色)和一个update()和下一个update()函数之间的时间,因此整个帧时间(blue)。

我看不到滞后之间的direkt链接,并且在更新/didfinishupdate之间很长一段时间。看起来好像,渲染过程需要更长的时间。

另一个有趣的观察结果:正常帧速率为60(16.6ms),但"滞后"框架的持续时间几乎为33ms,因此30fps。

现在我的两个问题:1.是否有任何方法可以分析渲染过程中发生的事情?2.你们中的任何人是否都观察到类似的现象,显然会跳过整个框架(如果这是33毫秒帧的正确解释)?

任何帮助将非常感谢!先感谢您!

ps:Times是在运行iOS 10.2的iPhone 7中记录的,该应用程序在Swift3中进行了编程。

我以前曾经看过这种问题,但在所有情况下都是我的错误。

最常见的原因是:

  • 在Skshapenodes上渲染动画(我只有18个旋转的7个段路径)。
  • 更改非常大的背景图像(在SKSprite节点中)
  • 在SKSprite动作的完成块中进行了沉重的处理。
  • 在另一个线程中具有大量(50000 )的对象实例(即被释放)。
  • 背景线程中的其他重型工作量。

并非所有这些引起渲染延迟,但它们确实在Skscene渲染中引起了一些明显的放缓。

最新更新