我之前问过一个问题,为什么我的播放器的移动看起来不流畅,有人建议我这样做。
如果您想(或需要)减少 CPU 使用率,您可以记录自上一帧以来经过的时间,如果还没有时间运行一帧,则休眠一毫秒,否则运行该帧。
但是,在这样做之后,我的玩家移动速度(粗略估计)大约是应该的 3-4 倍。不过,我感到困惑的是,我的运动是基于增量时间的,该时间累积到每秒 1000-1005 毫秒之间。我认为具有可变时间步长意味着无论帧速率如何,游戏更新都应该以相同的速度进行。我错了,还是我做错了什么?
主循环
private static final int UPDATE_RATE = 60;
private static final float UPDATE_PERIOD = 1000F / UPDATE_RATE;
private void mainLoop() {
long beginTime, timeTaken;
float timeLeft;
while (state == State.PLAYING) {
beginTime = System.nanoTime();
update();
repaint();
timeTaken = System.nanoTime() - beginTime;
timeLeft = (timeTaken / 16000F);
if (timeLeft < UPDATE_PERIOD) {
try {
Thread.sleep(1);
} catch (InterruptedException ex) { }
}
}
}
private void update() {
p.move(deltaTime);
}
运动算法:
public void move(float deltaTime) {
if(left && !right)
xPos -= 250*(deltaTime/1000);
if(right && !left)
xPos += 250*(deltaTime/1000);
}
增量时间计算(每次调用 repaint):
long currentTime = System.nanoTime();
deltaTime = (currentTime - previousTick) / 1000000F;
previousTick = currentTime;