如何在 Java 中制作固定时间步长

How to make fixed timestep in Java

我们应该如何在Java中设置固定时间步长?我认为有两种方法:

  1. 使用 while 同步游戏循环。
  2. 使用 Thread 的异步游戏循环。

最重要的是性能准确性。那么最好的方法是什么?

这是同步游戏循环:

    double timeStep = world.getSettings().getStepFrequency();
    long lastTime = System.nanoTime();

    while (true) {
        long currentTime = System.nanoTime();
        double elapsedTime = (currentTime - lastTime) / 1000000000.0;

        if (elapsedTime >= timeStep) {
            lastTime = currentTime;
            world.update(elapsedTime);
        }
    }

这是异步游戏循环:

    double timeStep = world.getSettings().getStepFrequency();
    long lastTime = System.nanoTime();

    Thread loop = new Thread() {
        public void run() {
            while (true) {
                long currentTime = System.nanoTime();
                double elapsedTime = (currentTime - lastTime) / 1000000000.0;
                lastTime = currentTime;

                world.update(elapsedTime);

                try {
                    Thread.sleep((long) Math.floor(timeStep * 1000));
                } catch (InterruptedException e) {}
            }
        }
    };
    loop.start();

同步游戏循环使用了很多 CPU(我想是 1 个核心?对我来说大约是 25%)。

CPU 异步游戏循环的使用率几乎为 0%。

注意:我要做的游戏是WebSocket基础游戏。服务器是物理的,HTML5的canvas是渲染的

你喜欢哪种方式?为什么?有没有更好的办法?

Java中有类API周期性的执行一个任务。最好不要尝试重新发明轮子并使用Java API。 ScheduledExecutorService 好像是你需要的

此示例定期执行 Runnable

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(myRunnable, initialDelay, period, TimeUnit.MILLISECONDS);

在您的第一个示例中,如果 elapsedTime >= timeStep 为真,您的线程将检查大量时间。它会一直检查直到它为真,而不是一次又一次地检查直到它最终为真,线程可能正在等待并且处理器可以用于其他事情。

第二个选项比第一个好,因为线程等待下一次执行的时间。