1

我注意到一些非常奇怪的事情(最终导致我的游戏崩溃),Thread.sleep()我无法弄清楚问题可能是什么。我已经连续运行了两个小时以下方法,输出始终为 100+-5;

public void gameLoop() {
    t0 = time();
    while (GameState.getInstance().getState() == GameCondition.RUNNING) {

        engine.update();
        sfx.play();

        t1 = time();
        delta = t1 - t0;

        gfx.render((int) delta);
        t0 = time();
        System.out.println(delta);
        sleep(100);
    }
}

现在,如果我运行完全相同的方法,但不是为常数 100 睡觉,而是为delta

public void gameLoop() {
    t0 = time();
    while (GameState.getInstance().getState() == GameCondition.RUNNING) {

        engine.update();
        sfx.play();

        t1 = time();
        delta = t1 - t0;

        gfx.render((int) delta);
        t0 = time();
        System.out.println(delta);
        sleep(delta);
    }
}

现在输出显示:

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

....
 After a minute
 571

我不知道是我太累了,犯了一个明显的错误还是发生了一些很奇怪的事情,这里是睡眠。

private void sleep(long milliSeconds) {
    System.out.println();
    try {
        Thread.sleep(milliSeconds);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

编辑:问题?delta 正在“泄漏”,因为内部方法(在睡眠之前)几乎不使用任何时间(如sleep(100)测试所证明的那样),我希望 delta 非常精确,波动很小甚至没有波动,但它会不断增长。

4

1 回答 1

6

在您的循环中,您的增量计算包含先前睡眠的时间,然后为这个新的增量时间休眠。如果睡眠(或你的代码)很慢(比如 1ms,这可能会发生),那么你的 delta 下次会长 1ms,所以你会睡 2ms。

自从您上次睡了 2 毫秒以来,您的下一次迭代将至少为 2 毫秒。如果睡眠或您的代码再次变慢(这将发生),那么您下次将睡眠 3 毫秒,依此类推。您正在累积由于您的增量可能发生的所有缓慢,包括之前的睡眠时间和其中的任何错误。

于 2013-04-11T23:48:21.397 回答