每隔一段时间更新图形
Updating graphics on an interval
每隔 t 更新图形屏幕的最佳方法是什么?假设使用 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 毫秒,我们将降低帧速率以跟上。
每隔 t 更新图形屏幕的最佳方法是什么?假设使用 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 毫秒,我们将降低帧速率以跟上。