我已多次看过这段代码。
long lastTime = System.nanoTime();
final double ticks = 60D;
double ns = 1000000000 / ticks;
double delta = 0;
上面的代码占用系统时间并将其存储到lastTime
。 60个滴答应该等于每秒更新的次数。
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if(delta >= 1){
tick();
delta--;
}
需要now
并减去lastTime
,然后将其转换为纳秒/ 60。是否有保证now
和lastTime
到纳米超过60的时间差会导致delta大于或等于每秒60次?我无法理解为什么tick();
每秒会跑60次左右。从我的计算中,每次循环运行增量增加0.0025左右。
答案 0 :(得分:2)
我对代码进行了一些评论,以便更清楚地向您展示正在发生的事情。
//Get the system time
long lastTime = System.nanoTime();
//Specify how many seconds there are in a minute as a double
//store as a double cause 60 sec in nanosec is big and store as final so it can't be changed
final double ticks = 60D;
//Set definition of how many ticks per 1000000000 ns or 1 sec
double ns = 1000000000 / ticks;
double delta = 0;
while(running){
//Update the time
long now = System.nanoTime();
//calculate change in time since last known time
delta += (now - lastTime) / ns;
//update last known time
lastTime = now;
//continue while delta is less than or equal to 1
if(delta >= 1){
//Go through one tick
tick();
//decrement delta
delta--;
}
现在我非常确定这是做什么的,但是如果没有看到tick()是什么就无法肯定地说
答案 1 :(得分:2)
确保tick()方法每秒执行60次。它被称为delta计时,并在整个游戏社区中被引用。使用增量计时的原因是使游戏在所有平台上以相同的速率运行。无论系统的速度如何,游戏中的物理和动画等内容都需要以相同的速率运行。如果你的系统速度很慢且游戏没有包含delta计时,那么物理运行速度会比游戏在快速系统上运行时慢。
工作原理
计算出每秒要更新的次数,在您的情况下,每秒更新60次。
找到时间函数内置语言的分辨率。您的代码使用Java内置的System.nanotime()函数,该函数返回系统运行了多少纳秒的长值。
一秒钟内有1000000000纳秒,这意味着每次调用tick()的时间差等于1000000000/60。这大约是16666666纳秒。这意味着每当调用tick()时,程序将在再次调用tick()之前等待16666666纳秒。
你必须做的是找到当前帧和最后一帧之间的时间,以纳秒为单位。此值除以时间步长(16666666)将为您提供已经过了多少必要时间的小数百分比。如果将此小数百分比添加到delta变量,当delta变量> = 1时,已经过了1/60秒,这意味着程序现在可以调用tick()。
最后你从delta变量减去1。你没有将delta变量设置为0的原因是因为可能有一个比1更大的时间步长而且delta变量将高于1,这意味着你下次需要考虑到这个时间循环并调用tick()
答案 2 :(得分:1)
在不知道tick()
中的内容的情况下,我无法确定,但我猜它还会使用60D
尝试在正确的时间内睡觉?所以:不,没有保证,这就是这个代码可以解决的问题。
它说“如果tick()
睡觉的时间少于一个滴答,那么就不要做任何事情;如果它睡了一个或多个滴答,请勾选一次”。
据推测,如果滴答足够(例如80ns然后80ns,意味着第一个循环递增滴答,第二个循环增加2),那么最终会有另一个循环只有40ns三角形,导致所有内容甚至出去了。