我开始研究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;
}
答案 0 :(得分:1)
正如 opiop65 已经说过的,增量时间就是你最后一帧开始和当前帧开始之间所花费的时间。
Delta时间可以是任何类型的单位:纳秒,毫秒(< - 通常这是标准)或秒。正如你所说,当游戏在60FPS上运行时delta时间是16,而当游戏在30FPS上运行时delta时间是32。至于原因,它很简单:为了让游戏以每秒60帧的速度运行,它必须每1000/60(= 16.666667)毫秒产生一个帧,但如果它以30帧运行,那么它必须产生一个帧每1000/30(= 33.333333)毫秒。
我们使用delta时间因为我们想要做运动和各种各样的东西依赖于时间而不是框架依赖。让我们说你想让你的一个游戏角色每秒水平移动1个单位。你是怎样做的?显然,你不能只是在角色的位置的X值上加1,因为它会在1*x
等于你的FPS时每秒移动x
次(假设你每帧都会更新角色) )。这意味着如果有人在1 FPS上运行游戏,他的角色每秒会移动1个单位,如果有人以5000 FPS的速度运行游戏,他的角色每秒会移动5000个单位。当然这是不可接受的。
有人可以说他会在每次更新时移动角色1/16.6667
单位,但如果某人有1 FPS,他每秒移动1/16.6667
个单位,而不是那个以5000 FPS运行的人,因此每秒移动5000*(1/16.6667)
个单位。
是的,您可以启用V-Sync但是如果有人拥有120Hz显示器(甚至更高)而不是60Hz? 是的,你可以锁定帧率,但你的玩家不会对此感到高兴。当游戏降至60FPS以下时,这也不能阻止角色放慢速度。那么现在呢?
达美时间救援!1*delta
如果游戏以高FPS运行则达美时间较低而如果游戏以低FPS运行则为高,从而使得这些角色变得更慢,以更高的FPS运行游戏(因此他会移动较小的数量但更频繁)和那些角色更快的人在较低的FPS上运行游戏(因此他会减少较少的移动量),最后他们会在同一时间内移动相同的距离。
请注意,与增量时间相乘时使用的单位确实很重要:
如果您使用毫秒,那么在60FPS时,您的增量将为16.6667
,最后每帧移动1*16.6667
= 16.6667
。但是,如果您以秒为单位测量增量时间,那么在60FPS时,您的增量时间将为0.016667
,这意味着您的角色每帧都会移动0.016667
个单位。
这不是你应该担心的,只要记住它。
答案 1 :(得分:0)
Delta时间只是一帧“处理”自身然后另一帧在屏幕上显示所花费的时间。它基本上是帧之间的时间,就像你说的那样。来自Google:
数学。变量的增量变化。
让我们挑选你的代码。
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
这一行只返回当前时间(我相信)毫秒?
long currentTime = getTime();
int delta = (int)(currentTime - lastTime);
lastTime = getTime();
return delta;
第一行只是获取当前时间。然后,第二行通过lastTime变量(显示最后一帧的时间)减去当前时间(显示当前帧的时间)来计算delta。然后将lastTime设置为currentTime,即显示当前帧的时间。当你想到它时它非常简单,它只是帧之间的时间变化。