-1
什麼是每隔一段時間更新一次屏幕的最佳方式t圖形?假設使用update()
調用更新方法,並且所有實際的圖形資料都在那裏發生,並且已經處理完畢,更新間隔的圖形
我已經使用了javax.swing.Timer,它在過去運行我的更新方法時觸發了一個指定時間間隔的動作事件,但計算機的速度仍然是一個因素。所以如果我正在做這個最好的方式(我懷疑)我該如何更新專屬於時間?
什麼是每隔一段時間更新一次屏幕的最佳方式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毫秒,我們將降低幀速率以跟上。
爲了澄清,像javax.swing.Timer這樣的類是否仍然遵循順序執行而不是線程化actionPerformed?如果是這樣,那麼線程更新方法的回收是什麼,而不是你所建議的? –
@Jared Massa:我從來沒有使用javax.swing.Timer,所以別人必須回答你的問題。我爲我的動畫使用Runnable類。 –