变量未在游戏循环中正确更新

时间:2018-07-02 21:08:52

标签: java loops

我正在用Java创建游戏。我有一个游戏循环,每秒仅运行60次,如下所示:

public void run() {

    double variable = 0;

    init();

    double delta, start, now, lastTime;
    double fps = 60.0;
    double timePerUpdate = 1000000000 / fps;
    delta = 0;
    lastTime = System.nanoTime();
    start = lastTime;

    while (running) {
        now = System.nanoTime();
        delta += (now - lastTime) / timePerUpdate;
        lastTime = now;

        if (delta >= 1) {
            variable += delta / fps;
            delta = 0;
            System.out.println((now - start) / variable / 1000000000);
        }
    }

    stop();
}

这是高度简化的,但它基本上显示了我在做什么。我有一个变量,我想每秒增加1,但每帧增加1/60左右,以便总每秒增加1。

在更新结束时,我将打印经过的总时间,除以变量,再除以1000000000(转换为秒)。

这应该打印1,因为变量每秒增加1,但是,它正在打印0.80.90.95,{{1} },0.99等接近1。为什么不完全是一个?

1 个答案:

答案 0 :(得分:0)

它打印的不是完全一幅,因为当差为1时,CPU不能精确地检查if条件。

意味着您不断增加增量,直到它大于1。一旦达到1,您将计算最后的增量,并计算变量,然后要求他打印差异。解释为什么它似乎达到1的原因可能是:随着时间差呈指数增长,计算的精度也会降低,并且趋向于1。因此达到1可能是计算值的舍入答案

查看此程序:

public static void main(String[] args) {
    run();
}
public static void run() {

    double variable = 0;


    double delta, start, now, lastTime;

    double fps = 60.0;
    double conversionRate = 1000000000.0;
    delta = 0;

    lastTime = System.nanoTime();

    start = lastTime;

    int counter = 1;
    while (true) {

        now = System.nanoTime();
        delta += (now - lastTime) / conversionRate;
        lastTime = now;

        // It fires every second or so 
        if (delta >= 1) {
            delta = 0;
            System.out.println("Counter is: " + counter++);
        }
    }
}

此程序每秒计数1。每秒不会精确地触发1秒。错误是由您在打印语句中计算表达式的方式引起的。