Javaで固定タイムステップをどのようにする必要がありますか?私は2つの方法があると思う: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);
}
}
これはasynchronisedゲームループです:
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のキャンバスはレンダリング用です。
どのような方法が好きですか?どうして?もっと良い方法はありますか?
精度が必要な場合は、前者を選択する必要があります。 Thread.sleep(例外がない場合)は、スレッドが実行されていない場所の最小値*を設定します。スケジューリングは、それでも任意の時間の間それを遅らせるかもしれません。 –
@DiegoMartinoiaしかし、キャンバスが60FPSでレンダリングすると、スレッドを120Hzで実行するように設定できます。 –
タイマーが最適です。 updateWorldに時間がかかりすぎると、フレームを落とすことができます。 –