我已经开始研究lwjgl了,我很难理解Delta是如何工作的。我已经浏览过与此相关的其他问题和网站,但这仍然是一个令人费解的话题。如果这里有人能帮我,那就太好了,所以请容忍我。
我知道60 for的达美时间是16,如果帧速率是30,大约是这个的两倍。我不明白这是怎么计算出来的。是帧间的时间吗?抱歉我问了个下流的问题。
private long getTime() {
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}
private int getDelta() {
long currentTime = getTime();
int delta = (int)(currentTime - lastTime);
lastTime = getTime();
return delta;
}
发布于 2014-04-03 04:03:54
正如opiop65已经说过的那样,增量时间只不过是从上一个帧的乞讨到当前帧的乞讨之间花费的时间。
它怎麽工作?
Delta时间可以是任何类型的单位:纳秒、毫秒(通常这是标准的)或秒。正如你所说的,当游戏运行在60 runs时,增量时间是16,当游戏运行在30 runs时,时间是32。至于为什么,这很简单:为了让游戏以每秒60帧的速度运行,它必须每1000/60 (= 16.666667)毫秒产生一个帧,但如果它以30帧运行,那么它必须每1000/30 (= 33.333333)毫秒产生一个帧。
但是为什么我们要使用增量时间呢?
我们使用增量时间,因为我们想要做运动和各种各样的东西,时间依赖,而不是框架依赖。让我们说,你想要你的游戏的角色之一水平移动1单位每秒。你怎么做到的?显然,您不能仅仅将1添加到字符的位置的X值中,因为在1*x
等于FPS的情况下,它每秒会被移动1次(假设您将更新每个帧的字符)。这意味着如果有人在1FPS上运行游戏,他的角色将每秒移动1个单位,而如果有人在5000 FPS上运行游戏,他的角色将每秒移动5000个单位。当然,这是不可接受的。
可以说他会在每次更新时移动字符1/16.6667
单位,但是如果某人有一个FPS,他每秒移动1/16.6667
单位,而不是那个在5000 FPS上运行的家伙,因此每秒移动5000*(1/16.6667)
单位。
是的,您可以启用V,但是如果有人有120 or监控器(甚至更高)而不是60 or呢?是的,你可以锁定框架,但你的球员不会对此感到太高兴。而且,这也不能阻止角色减速时,游戏下降到60英尺以下。那么现在呢?
达美是时候营救了!
你所要做的就是在每次更新中移动你的角色1*delta
。
如果游戏运行在较高的FPS上,则达美时间较低,从而使那些在较高FPS上运行游戏的角色变得更慢(因此他会移动较小的数量,但更频繁),而那些在较低的FPS上运行游戏的角色会更快(因此他会移动更多的FPS ),最终他们将在同一时间内移动相等的距离。
请注意,在与增量时间相乘时使用哪个单位确实很重要:
如果您使用millis,那么在60 you时,您的增量将是16.6667
,最后是1*16.6667
= 16.6667
移动的每一个帧。但是,如果您要以秒为单位度量您的增量时间,那么在60 you时,您的增量时间将是0.016667
,这意味着您的角色将移动每个帧的0.016667
单位。
这不是你应该担心的事情,只要记住就行了。
发布于 2014-03-31 05:56:10
Delta只是一个帧“处理”自身,然后在屏幕上显示另一个帧所需的时间。这基本上是帧间的时间,就像你所说的。来自谷歌:
数学。变量中的增量变化。
让我们把你的代码拆开。
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
这一行只返回当前时间(我相信)毫秒?
long currentTime = getTime();
int delta = (int)(currentTime - lastTime);
lastTime = getTime();
return delta;
第一行只获取当前时间。然后,第二行通过lastTime变量(即显示最后一帧的时间)减去当前时间(即显示当前帧的时间)来计算增量。然后lastTime设置为currentTime,这是显示当前帧的时候。它真的很简单,当你想到它,这只是时间的变化之间的框架。
https://stackoverflow.com/questions/22752464
复制相似问题