0

我之前问过一个问题,为什么我的播放器的移动看起来不流畅,有人建议我这样做。

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

2 回答 2

0

我不太明白你的问题,但我认为你实际上是通过睡眠一毫秒来降低游戏的性能,你应该让线程像 TimeLeft 一样睡眠,这将显着提高性能,因为它会安排下一次重绘帧以更有效的方式

于 2013-10-12T16:50:11.723 回答
0

我发现了我的问题。由于我正在计算调用 repaint 时的增量时间,因此它的变化速度比调用 update 的速度快,这意味着它的变化很大,移动它的速度比它应有的速度快。

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

于 2013-10-12T19:39:38.753 回答