之前我问了一个问题,为什么我的播放器的移动看起来不顺利,我被建议这样做。
如果您希望(或需要)减少CPU使用率,您可以保留自上一帧以来经过的时间计数,如果还没有时间运行帧,则休眠一毫秒,否则运行帧。 / p>
然而,在这样做之后,我的播放器移动速度大约为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);
}
Delta时间计算(每次调用重绘时):
long currentTime = System.nanoTime();
deltaTime = (currentTime - previousTick) / 1000000F;
previousTick = currentTime;
答案 0 :(得分:0)
我不太明白你的问题,但我认为你实际上是通过睡眠一毫秒来降低你的游戏性能,你应该让线程睡眠时间与TimeLeft一样多,这会大大提高性能,因为它会在下次安排以更有效的方式重新绘制框架
答案 1 :(得分:0)
我发现了我的问题。由于我在调用重绘时计算增量时间,因此它的更改速度比调用更新时更快,这意味着它的移动速度比它应该的速度快得多。
如果其他人遇到此问题,请在主循环中计算增量时间。