【问题标题】:Getting initial elapsed time SpriteKit获取初始经过时间 SpriteKit
【发布时间】:2014-12-23 13:41:11
【问题描述】:

在我的场景中,我已经覆盖了默认的-(void) update: (CFTimeInterval) currentTime 函数。值得注意的是,currentTime 变量实际上是自可能的任意系统时间开始以来经过的时间,而不是自上一帧以来的经过时间。此更新功能贯穿我所有的角色,并根据每秒速度和自上次更新以来经过的时间(以秒为单位)应用它们的移动。获取自上次更新以来经过的时间(以秒为单位)的常用方法是在您的类中有一个 NSTimeInterval 来存储上次更新,然后从当前更新时间中减去上次更新时间,得到经过的秒数。但是,初始经过的时间不为零。因此,从一个非常大的数字中减去零会产生数万秒的感知经过时间。因此,任何已经在第一帧开始运动的角色都会移动到很远的地方。

对此的明显解决方案是最初将上次更新时间设置为初始经过的时间。但是,我在SKScene,或者更具体地说,在-(void) didMoveToView: (SKView *) view 中看不到任何方法来访问它。

另一种解决方案是将初始 CFTimeInterval 设置为负数,例如 -1。然后,检查每个更新函数的时间是否为-1。如果是这样,则将自上次更新以来的经过时间设置为0,否则将执行普通的elapsedTime = currentTime - lastUpdate。然而,每一个更新函数都执行这个 if 语句看起来很混乱且不需要。

有没有其他方法可以准确地找到自上次更新以来经过的时间?

【问题讨论】:

  • 除非您的游戏是实时模拟,否则以这种方式使用时间间隔是否有意义?如果游戏跳过一两次更新,让角色立即跳到新位置有意义吗?这对用户公平吗?另外,当用户按下 Home 键然后稍后重新启动游戏时,elapsedTime 会发生什么情况?

标签: objective-c sprite-kit skscene


【解决方案1】:

你说得对,每次迭代都检查一个标志是浪费的,所以这是一个最有效解决方案的问题。

我认为最好的(阅读:最有效的)解决方案是除了简单地保存 currentTime 变量之外,不要在第一个 update 中应用任何更改。这根本不应该影响您的游戏玩法;没有人会注意到帧已被丢弃。您可以通过保存指向函数的指针来实现,在update 的第一次迭代中调用该函数,这也将更改指向另一个函数的指针,然后update 将从该点开始调用第二个函数。

我认为您正在寻找的方法是 CFAbsoluteTimeGetCurrent,但 SK 的 update 方法往往会退回一个不同的更早的时间,这可能是由于将时间传递给 update 而不是只使用CFAbsoluteTimeGetCurrent。如果您可以在不使用 if 的情况下增加一点额外开销,请忽略 currentTime 并始终在您的 update 方法中使用 CFAbsoluteTimeGetCurrent

再一次,如果您担心每个帧中单个 if 语句的开销,您就不会使用框架。无论如何,即使是最慢的移动处理器,每秒 60 ifs 也是微不足道的工作。

【讨论】:

  • 这看起来确实是一个过早优化的例子。我怀疑他的比赛会因为这个问题而放缓。这是检查时间差异的公认方法。如果它没有坏,为什么要修复它??
  • @hamobi 我正在解决这个问题,不仅是为了提高效率,也是为了清洁。在你的主更新函数中有一个只为真一次的 if 语句并不是很有吸引力。
  • 由您决定。我只是想如果它对于创建框架的苹果公司的人来说足够好,它对我们其他人来说可能就足够了。
  • 有趣的是,我的独特解决方案被否决了,而只是重复提问者已经陈述的答案却被投了赞成票。 @hamobi 这正是我所说的:“再说一次,如果您担心每个帧中单个 if 语句的开销,那么您就不会使用框架。每秒 60 个 if 对即使是最慢的工作也是微不足道的无论如何移动处理器。”
【解决方案2】:

我想我明白.. 但我可能不明白。如果我错了,请纠正我。但是您的问题是您的初始增量时间非常大,因此使用该值移动角色会导致他们在游戏的第一帧立即跳跃。如果是这样的话,那么你在更新中遗漏了一段关键的代码。

if self.last_update_time == 0.0 {  // this is the important part
    self.delta = 0
} else {
    self.delta = currentTime - self.last_update_time
}

self.last_update_time = currentTime

last_update_time 游戏开始时时间始终为 0,而 delta 也始终为 0。在那之后,您的增量值将是非常小的数字,您可以使用它来逐步移动您的精灵。

希望对您有所帮助

【讨论】:

  • 他说他已经考虑过这种方法,他正在寻求其他可能的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2017-07-16
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多