1

我已经开始研究 lwjgl 并且我特别难以理解 Delta 的工作原理。我浏览了与此相关的其他问题和网站,但这仍然是一个令人困惑的话题。如果这里有人可以帮助我,那就太好了,所以请多多包涵。

我知道 60fps 的 Delta 时间为 16,如果帧速率为 30,大约是两倍。我不明白这是如何计算的。是帧之间的时间吗?对不起这个noobish问题。

private long getTime() {
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}


private int getDelta() {
long currentTime = getTime();
int delta = (int)(currentTime - lastTime);
lastTime = getTime();
return delta;
}
4

2 回答 2

2

正如opiop65已经说过的,增量时间只是您上一帧开始和当前帧开始之间所花费的时间。

它是如何工作的?

增量时间可以是任何类型的单位:纳秒、毫秒(<- 通常这是标准)或秒。正如您所说,当游戏以 60FPS 运行时,增量时间为 16,而当游戏以 30FPS 运行时,增量时间为 32。至于原因,很简单:为了让游戏以每秒 60 帧的速度运行,它必须每 1000/60 (= 16.666667) 毫秒产生一帧,但如果它以 30 帧运行,则它必须产生一帧每 1000/30 (= 33.333333) 毫秒。

但是为什么我们使用增量时间呢?

我们使用增量时间是因为我们想做运动和各种时间相关的事情,而不是帧相关。假设您希望游戏中的一个角色每秒水平移动 1 个单位。你是怎样做的?显然,您不能只在角色位置的 X 值上加 1,因为它1*x每秒移动的次数x等于您的 FPS(假设您每帧都会更新角色)。这意味着如果有人以 1 FPS 运行游戏,他的角色每秒移动 1 个单位,而如果有人以 5000 FPS 运行游戏,他的角色每秒移动 5000 个单位。当然这是不能接受的。

有人可以说他会1/16.6667在每次更新时移动角色单位,但如果有人有 1 FPS,他会1/16.6667每秒移动单位,而不是那个以 5000 FPS 运行的人,因此5000*(1/16.6667)每秒移动单位。

是的,您可以启用垂直同步,但如果有人有 120Hz(或更高)而不是 60Hz 的显示器怎么办?是的,您可以锁定帧速率,但您的玩家不会对此感到太高兴。当游戏低于 60FPS 时,这也不会阻止角色减速。所以现在怎么办?

三角洲时间来救援!
您所要做的就是1*delta在每次更新时移动您的角色。
如果游戏以高 FPS 运行,则 Delta 时间很短,如果游戏以低 FPS 运行,则增量时间很长,因此使那些以更高 FPS 运行游戏的角色变得更慢(因此他会移动更少量但更频繁)和那些角色以较低的 FPS 运行游戏的速度更快(因此他会更频繁地移动较大的数量),最终他们将在同一时间内移动相等的距离。

请注意,与增量时间相乘时使用的单位很重要:
如果您使用毫秒,那么在 60FPS 时,您的增量将以=每帧移动16.6667结束。但是,如果您以秒为单位测量增量时间,那么在 60FPS 时,您的增量时间将意味着您的角色每帧都会移动单位。 这不是您应该担心的事情,请记住这一点。1*16.666716.66670.0166670.016667

于 2014-04-03T12:03:54.437 回答
0

增量时间只是一帧“处理”自身然后另一帧显示在屏幕上所花费的时间。正如您所说,它基本上是帧之间的时间。来自谷歌:

数学。变量的增量变化。

让我们分开你的代码。

return (Sys.getTime() * 1000) / Sys.getTimerResolution();

此行仅以(我相信)毫秒为单位返回当前时间?

long currentTime = getTime();
int delta = (int)(currentTime - lastTime);
lastTime = getTime();
return delta;

第一行只是获取当前时间。然后第二行通过 lastTime 变量(即显示最后一帧的时间)减去当前时间(即显示当前帧的时间)来计算 delta。然后lastTime设置为currentTime,也就是显示当前帧的时间。当你考虑它时,它真的很简单,它只是帧之间的时间变化。

于 2014-03-31T13:56:10.367 回答