0

我有问题。要制作视频游戏,我必须实现一个名为 update() 的函数。

参数 lastCallTime 是我们最后一次调用更新。

它必须执行以下操作:

  1. 计算自上次调用更新以来经过的时间。

  2. 如果经过的时间超过 20[ms],则 ifUpdate = true。

  3. 并重置每个对象的 lastUpdated 时间。

private long lastUpdated;               //The last updated time for this object.

public boolean update (long lastCallTime){
    boolean ifUpdate = false;

    long currentTime = System.currentTimeMillis();
    long delta = (currentTime - lastCallTime);
    if (delta >= 20){
        //Do something and
        ifUpdate = true;
        lastUpdated = 0;
    }
    return ifUpdate;
}

一个线程将调用此方法:

@Override
public void run(){
    long lastCallTime;
    int k = 0;

    lastCallTime = System.currentTimeMillis();
    while(true){
        //Do something
        boolean ifUpdate = update(lastCallTime);          
    }
}
4

1 回答 1

1

前段时间我写过类似的东西。将以 FPS 速率(示例中为 24)调用更新方法。因此,需要计算更新方法消耗的时间(变量timeDiff)。还检查进程是否比指示的(变量overSleepTime)更多或更少睡眠,这个时间将在下一个周期添加/减去。

希望对你有帮助

long timeDiff, sleepTime;
long afterTime, beforeTime;
long overSleepTime = 0L;

int fps = 24; // the desire FPS
long period = 1000000000L / fps;

while(true) {
  beforeTime = System.nanoTime();

  // your game logic
  update();

  afterTime = System.nanoTime();

  // timeDiff is time needed by the update process
  timeDiff = afterTime - beforeTime;
  sleepTime = (period - timeDiff) - overSleepTime;

  if(sleepTime > 0) {
    try {
      Thread.sleep(sleepTime / 1000000L); // sleeptTime is in nano secs and sleep expects millis
    } catch(InterruptedException e) {}

    // checks if the thread has slept more than desired
    overSleepTime = (System.nanoTime() - afterTime) - sleepTime;

  } else {
    // negative sleeptTime means that the system can't be update at the desired rate
    overSleepTime = 0L;
  }
}

}

于 2013-06-10T09:58:35.930 回答