对于图形,每隔一段时间更新屏幕的最佳方式是什么?假设更新方法是用update()
调用的,并且所有实际的图形都发生在那里,并且已经处理好了。
我过去曾使用javax.swing.Timer来触发一个操作事件,该事件在指定的时间间隔内运行我的更新方法,但计算机的速度仍然是一个因素。那么,如果我以最好的方式(我对此表示怀疑)进行更新,我该如何将更新留给时间?
Java中的系统时钟调用不一定非常准确。以下是一种在等待指定时间段时考虑更新时间的方法。
在这个例子中,我们每40毫秒更新一次,或者每秒更新25帧。
package com.ggl.testing;
public class TimerRunnable implements Runnable {
private static final long interval = 40L; // 40 milliseconds
@Override
public void run() {
long startTime = System.currentTimeMillis();
while (true) {
update();
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
elapsedTime = Math.max((interval - elapsedTime), 5L);
sleep(elapsedTime);
startTime = System.currentTimeMillis();
}
}
private void sleep(long interval) {
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
}
}
private void update() {
}
}
我们看到执行更新方法需要多长时间。我们计算经过的时间,并确保间隔减去经过的时间不会低于5毫秒。如果更新时间超过35毫秒,我们将降低帧速率以跟上。