0
我們應該如何在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花費太長時間,它應該能夠「丟幀」。 –