如何在 Java 中制作固定时间步长
How to make fixed timestep in Java
我们应该如何在Java中设置固定时间步长?我认为有两种方法:
- 使用
while
同步游戏循环。
- 使用
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
为真,您的线程将检查大量时间。它会一直检查直到它为真,而不是一次又一次地检查直到它最终为真,线程可能正在等待并且处理器可以用于其他事情。
第二个选项比第一个好,因为线程等待下一次执行的时间。
我们应该如何在Java中设置固定时间步长?我认为有两种方法:
- 使用
while
同步游戏循环。 - 使用
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
为真,您的线程将检查大量时间。它会一直检查直到它为真,而不是一次又一次地检查直到它最终为真,线程可能正在等待并且处理器可以用于其他事情。
第二个选项比第一个好,因为线程等待下一次执行的时间。