【问题标题】:Is there a way to program games without depending on fram rate?有没有办法在不依赖帧速率的情况下对游戏进行编程?
【发布时间】:2014-05-06 14:50:08
【问题描述】:

我正在编写一个 iOS 游戏,我在很多事情上都使用方法 update,它在游戏速度刷新时调用(目前每秒 60 次)但问题是帧速率是否下降(例如一个通知,或者游戏中的任何行为,当被调用时,它会使 fps 下降一点点......)然后错误就来了......

一个快速的例子是,如果我有 80 张图片的动画,40 用于跳跃,40 用于下降,我需要 1.2 秒来运行动画,所以如果跳跃需要 1.2 秒就可以了,动画将运行。但是,如果我的 fps 下降到 30,那么动画就会中断,因为运行动画需要 2.4 秒,但跳跃仍然是 1.2 秒。这只是一个简单的例子,如果帧速率下降,游戏中会出现很多意外行为,所以我的问题是,游戏开发者是否如此依赖帧速率,或者有办法避免那些 fps 错误? (另一种编程方式或任何技巧?)

【问题讨论】:

  • 如果不了解正在发生的一切,很难为您提供帮助。您说通知会使 fps 下降。该通知触发了什么?我认为答案对处理下降有很好的建议。但就个人而言,我会调查下降的原因。设备上的节点和绘制计数和 fps 是什么?是批量渲染你的纹理吗?
  • 我在我的回答中添加了一些关于 FPS 与基于时间的技术的很酷的参考。看看吧!

标签: ios objective-c sprite-kit


【解决方案1】:

根据时间而不是帧数来确定您的时间安排。所以,在每一帧上保存一个时间戳,在下一帧上,计算已经过去了多少时间,并根据你的理想帧率,计算出要推进多少帧动画。在全速下,您应该不会注意到差异,当帧速率下降时,您的动画可能会变得不稳定,但运动永远不会落后于应有的位置超过 1 帧。

编辑:正如 uliwitness 指出的那样,请注意您使用的时间功能,以免在计算机进入睡眠状态或游戏暂停时遇到问题。

【讨论】:

  • 几乎每个游戏循环都是如此运作的。
  • @trojanfoe 简单问题有什么问题?这不是第一次,你正在这样做。如果您有文章或副本向 OP 解释此事,请链接它。而不是嘲笑那些真正想帮忙的人。
  • @Jawap 谁在嘲笑?这个答案解释了游戏循环总是发生的事情,并没有为如何解决所提出的具体问题提供“一些新的见解”。一两个参考是为了提供对该过程的更彻底的解释。
  • 如果没有来自 OP 的特定代码示例,我不确定我能提供多少详细信息。我可以写一些通用的东西,但不确定它会有多大帮助。 (但我正在努力成为一名优秀的 SO 公民,所以我很乐意接受批评。)
  • 使用“时间”时的一个警告:选择正确的时间函数。通常,您需要一个计算计算机运行时间的计算机。另一个计时功能计算挂钟时间。所以,如果你让你的笔记本电脑进入睡眠状态,前者会暂停并从你开始的地方继续,而后者会立即跳到动画的结尾。
【解决方案2】:

始终在更新方法中使用增量值。这是平台和引擎独立的。将任何速度或变化值乘以增量值(当前帧和最后一帧之间的时间间隔)。

如果是动画,解决问题的一种方法是将动画计数器乘以 delta(以及预期间隔的倒数)。然后将该值四舍五入以获得正确的动画图像。

// currentFrame is a float ivar set to 0 at the beginning of the animation.
currentFrame = currentFrame + delta * 60.0;
int imageIndex = roundf(currentFrame);

但是,使用 Sprite Kit 有更好的方法来制作这种动画,因为有一个预制的 SKAction 处理 sprite 动画。

[SKAction animateWithTextures:theTextures timePerFrame:someInterval];

使用此解决方案,您根本无需处理图像计时问题。引擎会为您做到这一点。

【讨论】:

    【解决方案3】:

    这里有关于基于 FPS 和基于时间的技术的精彩讨论:

    这是我认为最好的,非常完整,易于理解并提供 JsFiddle 示例。我把这些例子翻译成C++/Qt

    Click here 观看我的应用运行的视频:

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 2020-04-29
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2020-08-25
      相关资源
      最近更新 更多