SpriteKit - 游戏在didFinishUpdate和下次更新之间滞后(在场景渲染期间)

时间:2017-03-02 21:53:25

标签: ios swift xcode sprite-kit

更新 我删除了在我的应用程序中运行的大多数进程,但仍然观察到这些"滞后"。所以我尝试了一个新项目(SpriteKit Demo项目附带XCode 8并记录了帧时间。即使在这里,帧也是滞后的。请看下面的图片:Frame time from 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
}

我仍然想知道为什么滞后的帧持续时间会跳到33毫秒。这是SpriteKit的工作方式,我的意思是,如果并非所有过程都及时完成而不是将单个帧持续时间延长完成所有过程所需的时间,那么是否会跳过下一帧?

原始问题 我的SpriteKit游戏偶尔会滞后。不幸的是,到目前为止我无法确定任何可能导致滞后的功能或过程。所以我试着通过测量整个场景处理过程中经过的时间来缩小范围。请看图表: Plot: Total frame time vs. update->didFinishUpdate

我绘制了在进入update()函数之间经过的时间,直到调用didFinishUpdate()(橙色)和一次更新()与下一个update()函数之间的时间,因此整个帧时间(蓝色)。

我无法看到延迟与更新/ didFinishUpdate之间的超长时间之间的直接链接。看起来好像,某些帧的渲染过程需要更长的时间。

另一个有趣的观察结果:正常的帧率是60(16.6ms),但是"滞后"帧的持续时间相当于33毫秒,所以30fps。

现在我的两个问题: 1.有没有方法可以分析渲染过程中发生了什么? 2.你们中是否有人观察到类似的现象,显然整个画面被跳过(如果这是对33ms画面的正确解释)?

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

PS:时间是在运行iOS 10.2的iPhone 7上录制的,应用程序是用swift3编程的。

1 个答案:

答案 0 :(得分:0)

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

最常见的原因是:

  • 在SKShapeNodes上渲染动画(我只有18个,其中7个路段都在旋转)。
  • 更改非常大的背景图像(在SKSprite节点中)
  • SKSprite操作的完成块中的重处理。
  • 在另一个线程中有超大数量(50000+)的对象实例超出范围(即被释放)。
  • 后台线程中的其他繁重工作负载。

并非所有这些都导致渲染延迟,但它们确实导致SKScene渲染出现明显的减速。