Thread.sleep()中的奇怪行为

ary*_*naq 1 java sleep

我注意到一些非常奇怪的东西(最终导致我的游戏崩溃),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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行完全相同的方法,而不是睡觉的常数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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在输出如下:

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
Run Code Online (Sandbox Code Playgroud)

我不知道我是否太累了,犯了一个明显的错误,或者发生了一些非常奇怪的事情,这就是睡眠.

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

编辑:问题?三角洲是"泄漏",因为内部方法(在睡眠之前)几乎没有时间使用(正如sleep(100)测试所证明的那样)我期望delta非常精确,从小到小没有波动,但它仍在不断增长.

Tre*_*man 6

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

你的下一次迭代,因为你上次睡了2ms,将至少2ms.如果睡眠或你的代码再次变慢(会发生),那么下次你将睡3ms,依此类推.您正在积累由于您的delta而可能发生的所有缓慢,包括之前的睡眠时间及其中的任何错误.