java - Thread.sleep() 中的奇怪行为

标签 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);
    }
}

现在,如果我运行完全相同的方法,但不是 hibernate 常数 100,而是 hibernate 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

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

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

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

最佳答案

在您的循环中,您的增量计算包含之前 sleep 的时间,然后 sleep 这个新的增量时间。如果 sleep (或您的代码)过慢(例如 1 毫秒,这可能会发生),那么下次您的增量将延长 1 毫秒,因此您将 sleep 2 毫秒。

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

关于java - Thread.sleep() 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15960607/

相关文章:

java - @OrderColumn、@OneToMany & 用于集合的空索引列

java - 如何在基于 Spring DAO 的应用程序中实现 xml?

java - 如何在 Java 中为用户显示消息框

python - 制作计时器 : timeout inaccuracy of threading. Event.wait - Python 3.6

jquery - 为什么第二个独立的ajax响应要等到第一个ajax响应才能获取?

java - JPA类之间的关系,指的是它们的接口(interface)

java - 我想打印有多少数字大于平均值

java - 同步块(synchronized block)中的 sleep() 方法行为

c++ - 进程启动前窗口不弹出 -> 尝试了 sleep() 方法,但是 "fails"

PHP set_time_limit 限制