Performance 滞后于deltaTime

Performance 滞后于deltaTime,performance,game-engine,frames,Performance,Game Engine,Frames,我是一个游戏开发新手,我有一个问题,我正试图处理。我在一个使用JAVA的Android游戏中工作 情况是,我正在使用deltaTime在任何设备中进行平滑移动等,但我遇到了一个问题。在游戏的某个特定时刻,它实现了一个相当昂贵的操作,该操作会增加下一次迭代的增量。有了这个,下一次迭代会有点滞后,在旧的慢速设备中可能会非常糟糕 为了解决这个问题,我想到了一个解决方案,我想和大家分享一下,并对这个方案可能发生的情况给出一些反馈。算法如下所示: 1) Every iteration, the delta

我是一个游戏开发新手,我有一个问题,我正试图处理。我在一个使用JAVA的Android游戏中工作

情况是,我正在使用deltaTime在任何设备中进行平滑移动等,但我遇到了一个问题。在游戏的某个特定时刻,它实现了一个相当昂贵的操作,该操作会增加下一次迭代的增量。有了这个,下一次迭代会有点滞后,在旧的慢速设备中可能会非常糟糕

为了解决这个问题,我想到了一个解决方案,我想和大家分享一下,并对这个方案可能发生的情况给出一些反馈。算法如下所示:

1) Every iteration, the deltatime is added to an "average deltatime variable" which keeps an average of all the iterations

2) If in an iteration the deltaTime is at least twice the value of the "average variable", then I reasign its value to the average
有了这一点,游戏将适应设备的实际性能,并且不会滞后于具体的迭代


你觉得怎么样?我只是编出来的,我想更多的人会遇到这个问题,还有一个更好的解决方案。。。需要提示!谢谢

有一种比存储平均值更简单、更准确的方法。我不相信你的建议能得到你想要的结果

  • 取上一帧开始以来的总时间跨度(包括分数)-这是您的 增量时间。它通常是毫秒或秒
  • 应用前,将移动速度乘以增量时间 它
这使您具有帧速率独立性。你需要进行试验,直到你的速度正确为止

让我们从上面的评论中考虑例子:

如果你有一帧需要1毫秒,而物体移动了10个单位 每帧以每毫秒10个单位的速度移动。然而,如果 一帧需要10毫秒,你的物体会减慢到每毫秒1个单位

  • 在第一帧中,我们将速度(10)乘以1(增量时间)。这给了我们10的速度
  • 在第二帧中,我们的增量是10-帧的速度慢了十倍。如果我们把速度(10)乘以delta(10),我们得到100。这与物体在1ms帧中移动的速度相同
我们现在在游戏中有了一致的移动速度,不管屏幕多久更新一次

编辑

回应你的评论。 答案是更快的计算机;)帧速率一致性没有简单的解决方法,它可以以多种方式表现出来——屏幕撕裂是最严峻的困境

在三角洲极不一致的帧中,你在做什么?考虑优化代码。以下操作确实会降低帧速率:

  • 人工智能程序,比如路径
  • IO操作,如磁盘/网络访问
  • 程序资源的生成
  • 物理学
  • 任何其他不呈现代码的内容
这些都会导致增量增加X,这取决于算法的顺序和正在处理的数据量。考虑在一个单独的线程中执行这些长时间运行的操作,并在它们准备好的时候执行/显示结果。

更多编辑: 不管游戏规则如何,你在解决方案中有效地做的是减缓一切,以避免跳入屏幕位置

以射击运动员为例,反射是一切,速度的估计非常重要。如果帧速率翻倍,你将播放机的旋转速度减半一帧,会发生什么?现在,玩家的帧速率出现峰值,他们的十字线移动速度比他们想象的要慢。更糟糕的是,因为您使用的是运行平均值,后续帧的移动速度会减慢

对于一个慢帧来说,这似乎是一个连锁反应。如果你有一个物理引擎,那缓慢的画面甚至可能对游戏世界产生非常真实的影响


最后一个想法:增量时间的概念是将游戏规则与正在运行的硬件断开连接-您的解决方案使用增量商重新连接它们

每一帧都不是为了平滑移动,而是为了确保用于在帧之间移动项目的标量度量(速度是一个很好的示例)提供一致的结果,不考虑实际帧率(由GPU和CPU决定)。例如,如果有一帧需要1ms,而每帧移动10个单位的对象正以每毫秒10个单位的速度移动。然而,如果一帧需要10毫秒,你的物体会减慢到每毫秒1单位。这可能有助于你记忆。Delta是字母“D”的奇特的陆军英雄语音。从数学上讲,D在这个例子中代表持续时间,我可能解释错了。我已经在用速度等方法做了。问题是,在第二次迭代中,在需要10毫秒的迭代中,当对象在一次迭代中移动100时,它看起来很滞后,因为在一次迭代中移动了很多。我知道它使用的速度与10次1毫秒的迭代速度相同,但是因为它在一次迭代中移动了很多距离,所以移动太多,产生了问题。我在寻找解决办法。是的。。。我会尽可能地优化,但你不认为我写的解决方案可行吗?它很简单,看不到太多问题。游戏中没有太多的东西在移动,因此如果我因为一次迭代而浪费时间,我不介意在下一次移动中浪费时间。@Frion3L我认为您可能会从用户的角度放大对问题的看法。你是否曾经经历过流媒体音频延迟,并让它以4倍的速度播放以赶上?这就是问题所在。即使有滞后,游戏也不应该以快速的动作赶上时间。我认为它应该以与正常迭代相同的速度运行。@Frion3L您的解决方案将为您提供类似于您所追求的结果。祝你好运