可变时间步,我误解了吗?

时间:2013-10-12 16:02:55

标签: java timing

之前我问了一个问题,为什么我的播放器的移动看起来不顺利,我被建议这样做。

  

如果您希望(或需要)减少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;

2 个答案:

答案 0 :(得分:0)

我不太明白你的问题,但我认为你实际上是通过睡眠一毫秒来降低你的游戏性能,你应该让线程睡眠时间与TimeLeft一样多,这会大大提高性能,因为它会在下次安排以更有效的方式重新绘制框架

答案 1 :(得分:0)

我发现了我的问题。由于我在调用重绘时计算增量时间,因此它的更改速度比调用更新时更快,这意味着它的移动速度比它应该的速度快得多。

如果其他人遇到此问题,请在主循环中计算增量时间。