Ios SpriteKit-游戏在didFinishUpdate和下一次更新之间延迟(场景渲染期间)
更新 我删除了应用程序中运行的大部分进程,但仍然观察到这些“滞后”。因此,我尝试了一个新项目(XCode 8附带的SpriteKit演示项目,并记录了帧时间。即使在这里,帧也会滞后。请参见下图:。至少这对我的游戏没有影响,这不会使调试变得更容易。:-/ 你能观察到同样的效果吗?你可以简单地用以下代码记录时间:Ios SpriteKit-游戏在didFinishUpdate和下一次更新之间延迟(场景渲染期间),ios,swift,xcode,sprite-kit,Ios,Swift,Xcode,Sprite Kit,更新 我删除了应用程序中运行的大部分进程,但仍然观察到这些“滞后”。因此,我尝试了一个新项目(XCode 8附带的SpriteKit演示项目,并记录了帧时间。即使在这里,帧也会滞后。请参见下图:。至少这对我的游戏没有影响,这不会使调试变得更容易。:-/ 你能观察到同样的效果吗?你可以简单地用以下代码记录时间: var cycleStart = Date().timeIntervalSince1970 var cycleEnd = Date().timeIntervalSince1970 var
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游戏偶尔会出现延迟。不幸的是,到目前为止,我无法确定任何可能导致延迟的功能或进程。因此,我试图通过测量整个场景处理过程中经过的时间来缩小延迟。请查看图表:
我绘制了从输入update()函数到调用didFinishUpdate()所经过的时间(橙色)和从一个update()函数到下一个update()函数之间的时间,因此整个帧时间(蓝色)
我看不到延迟和更新/didFinishUpdate之间的超长时间之间存在直接联系。看起来,渲染过程在某些帧上花费的时间更长
另一个有趣的观察结果:正常帧速率为60(16.6ms),但“滞后”帧的持续时间几乎为33ms,因此为30fps
现在我有两个问题:
1.是否有任何方法可以分析渲染过程中发生的情况?
2.你们有没有人观察到类似的现象,明显跳过了一整帧(如果这是对33ms帧的正确解释)
非常感谢您的帮助!提前谢谢
PS:时间记录在运行iOS 10.2的iPhone 7上,应用程序是用swift3编程的。我以前见过这种问题,但在所有情况下,故障都是我的 最常见的原因是:
- 在SKShapeNodes上渲染动画(我只有18个,每个都有7个旋转的段路径)
- 更改非常大的背景图像(在SKSprite节点中)
- SKSprite动作完成块中的繁重处理
- 在另一个线程中有大量(50000+)的对象实例超出范围(即被释放)
- 后台线程中的其他繁重工作负载
并非所有这些都会导致渲染延迟,但它们确实会导致SKScene渲染中出现一些明显的速度减慢。请添加一些代码来演示问题,或者我们无法提供太多帮助。我希望我可以添加一些代码。因为所有函数都完全在update()和didFinishUpdate()之间执行,而且延迟帧和长函数执行时间之间没有明显的关系,我不知道应该发布哪些代码部分。谢谢,Alain!我在不同的后台线程中有很多工作。我认为这是从常规场景更新中删除操作的最佳方法。我将对此进行研究。但是你对larg的评论e图像听起来更有希望。我有一个由两个sprite节点组成的无限滚动背景。它们都有大约320x1000像素的交替图像。相当大,对吧?我希望这就是问题所在。我调查完后会发布结果。谢谢