Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SpriteKit-游戏在didFinishUpdate和下一次更新之间延迟(场景渲染期间)_Ios_Swift_Xcode_Sprite Kit - Fatal编程技术网

Ios SpriteKit-游戏在didFinishUpdate和下一次更新之间延迟(场景渲染期间)

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

更新 我删除了应用程序中运行的大部分进程,但仍然观察到这些“滞后”。因此,我尝试了一个新项目(XCode 8附带的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
}
我仍然想知道为什么滞后帧持续时间会跳到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像素的交替图像。相当大,对吧?我希望这就是问题所在。我调查完后会发布结果。谢谢