SpriteKit -
更新 我删除了大部分我的应用程序运行的进程,但仍观察到这些“滞后”(场景进行渲染时)didFinishUpdate和下一个更新的博弈滞后。所以我尝试了一个新项目(与XCode 8一起发布的SpriteKit Demo项目并记录了帧时间,即使在这里,帧也是滞后的,请看下面的图片:Frame time from SpriteKit demo。至少这对我的游戏没有影响, “T使其更容易调试..: -/SpriteKit -
你可以观察到同样的效果你可以简单地用下面的代码记录时间:
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游戏有时会滞后。不幸的是,我无法确定可能导致滞后的任何功能或过程。所以我试图通过测量整个场景处理过程中的时间来缩小它的范围。请看看图: Plot: Total frame time vs. update->didFinishUpdate
我绘制进入update()函数,直到didFinishUpdate()之间的时间间隔被称为(橙色)和时间一个更新()和下次更新之间()函数,所以整个帧时间(蓝色)。
我看不到延迟之间的direkt链接和update/didFinishUpdate之间的超长时间。看起来好像渲染过程对于某些帧需要更长的时间。
另一个有趣的观察:正常帧速率是60(16.6ms),但“滞后”帧持续时间大约是33ms,所以30fps。
现在我的两个问题: 1.是否有任何方法来分析渲染过程中发生了什么? 2.你们有没有观察到类似的现象,显然整个帧被跳过(如果这是对33ms帧的正确解释)?
任何帮助,非常感谢!先谢谢你!
PS:在运行iOS 10.2的iPhone 7上记录时间,该应用程序在swift3中编程。
我以前见过这种类型的问题,但在任何情况下都是我的错。
最常见的原因是:
- 上SKShapeNodes渲染的动画(I仅仅有18个与每一个被旋转的7个路径)。
- 更改非常大的背景图像(在SKSprite节点中)
- 在SKSprite动作的完成块中进行重处理。
- 在另一个线程中有很多(50000+)个对象实例超出范围(即被释放)。
- 后台线程中的其他繁重工作负载。
并非所有这些都会导致渲染延迟,但它们的确会在SKScene渲染中引起一些明显的减速。
谢谢,阿兰!我在不同的后台线程中进行了很多工作。我认为这是从常规场景更新中消除操作的最佳方式。我会研究一下。但是你对大图的评论听起来更有希望。我有两个精灵节点中的无限滚动背景。它们都具有约320x1000像素的交替图像。很大,对吧?我希望这是问题。一旦我调查了结果,我就会发布结果。谢谢 – Kai
请添加一些代码来说明问题,或者我们无法帮助很多 –
我希望我可以添加一些代码。由于所有函数都是在update()和didFinishUpdate()之间完全执行的,并且在滞后帧和长函数执行时间之间没有可见关系,所以我不知道应该发布哪些代码部分。 – Kai