【发布时间】:2017-03-02 21:53:24
【问题描述】:
更新 我删除了我的应用程序中运行的大部分进程,但仍然观察到这些“滞后”。所以我尝试了一个新项目(XCode 8 附带的 SpriteKit Demo 项目并记录了帧时间。即使在这里,帧也有延迟。请看下图: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() 和下一个 update() 函数之间的时间,即整个帧时间(蓝色)。
我看不到延迟之间的直接链接以及 update/didFinishUpdate 之间的超长时间。看起来,好像某些帧的渲染过程需要更长的时间。
另一个有趣的观察:正常帧速率是 60(16.6 毫秒),但“滞后”帧的持续时间几乎是 33 毫秒,因此是 30 fps。
现在我的两个问题: 1、有什么方法可以分析渲染过程中发生了什么? 2. 你们中是否有人观察到类似的现象,显然整个帧被跳过(如果这是对 33ms 帧的正确解释)?
非常感谢任何帮助!先感谢您!
PS:时间是在运行 iOS 10.2 的 iPhone 7 上记录的,应用程序是在 swift3 中编程的。
【问题讨论】:
-
请添加一些演示问题的代码,否则我们无能为力
-
我希望我可以添加一些代码。由于所有函数都完全在 update() 和 didFinishUpdate() 之间执行,并且在滞后帧和较长的函数执行时间之间没有可见的关系,我不知道我应该发布哪些代码部分。
标签: ios swift xcode sprite-kit