我在JPanel中有一個動畫,它通過javax.swing.Timer自行更新。這個定時器可以被構造成具有毫秒的延遲,該延遲必須是整數。如果我要每秒更新JPanel 60次,我會將延遲設置爲1000/60 =〜16.6666。但是,這種延遲必須是整數,所以我可以選擇舍入或舍入。對於16毫秒的延遲,動畫將以每秒62.5幀更新。四捨五入達到17毫秒的延遲將產生58.824的幀速率。Java定時器Swing準確地60 fps
我該如何去準備每秒60幀的幀速率?
在此先感謝。
我在JPanel中有一個動畫,它通過javax.swing.Timer自行更新。這個定時器可以被構造成具有毫秒的延遲,該延遲必須是整數。如果我要每秒更新JPanel 60次,我會將延遲設置爲1000/60 =〜16.6666。但是,這種延遲必須是整數,所以我可以選擇舍入或舍入。對於16毫秒的延遲,動畫將以每秒62.5幀更新。四捨五入達到17毫秒的延遲將產生58.824的幀速率。Java定時器Swing準確地60 fps
我該如何去準備每秒60幀的幀速率?
在此先感謝。
我看到兩個選項可以幫助你。他們最終以相同的方式達到同樣的目的,但代碼或多或少是一般的。我還沒有找到任何工具可以幫助你,所以它需要一點點工作。
的第一個選擇是做這樣的事情:
/**
* Called by the timer when the next iteration is due. Assume that
* this happens at the right moment.
*/
public void onTimerUpdate() {
updateAnimation();
// Compute the next point in time that corresponds to the
// frame rate you want.
long nextScheduledTimestamp = getNextTimestampInNanos();
long nanos = System.timeNanos();
timer.schedule(task, convertToMillis(nextScheduledTimestamp - nanos));
}
第二個選項是讓你得到你的java.util.Timer中的副本: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Timer.java
和重寫是位毫秒特異性。在其OpenJDK的執行沒有什麼顯示,其分辨率爲毫秒的特定,所以你應該能夠Object.wait(millis, nanos)
更換Object.wait(millis)
電話: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait(long,%20int)
有趣的文章,只是爲了好玩:https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks
它幾乎沒有那樣複雜那!您可以輕鬆地完成重繪()或任何其他方法,你需要調用正好60倍存在第二個具有一個最大的環
while(true) {
repaint();
try {
Thread.sleep(1000/60);
} catch (InterruptedException e) {
}
}
我把這個在我的腳本的主要方法,但基本上它是一個無限循環因爲true總是等於true,所以它調用repaint,告訴循環爲一個框架休眠,然後再次調用repaint。並且1000/60睡眠將導致這個循環被準確地稱爲每秒60次
系統定時器通常具有〜15ms的分辨率。所以,你不可能得到你想要的精確分辨率。 –
即使系統定時器不準確,它應該隨時間推移平均誤差(如果我的邏輯沒有錯誤)並且仍然給出相同的,不希望的幀速率(在上面)。 – olta8