(Delta时间)在java中获得60次更新

时间:2014-11-10 06:52:05

标签: java time delta nanotime

我已多次看过这段代码。

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。是否有保证nowlastTime到纳米超过60的时间差会导致delta大于或等于每秒60次?我无法理解为什么tick();每秒会跑60次左右。从我的计算中,每次循环运行增量增加0.0025左右。

3 个答案:

答案 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三角形,导致所有内容甚至出去了。