如何以客戶端顯示器的最大刷新率對JPanel進行動畫製作?Swing中的流暢動畫
我想要發生的是paintComponent
只在上次更新後調用。我可以通過使用Timer
來每隔(1000/60)ms計劃repaint()
,但我只是猜測刷新率是多少。
實際上,我想連續調用repaint
。但是如果我每秒鐘撥打repaint
200次,而且EDT不忙,它會每秒執行paintComponent
200次,這是對處理器時間的低效使用,並且可能會對應用程序的其他性能產生負面影響。
如何以客戶端顯示器的最大刷新率對JPanel進行動畫製作?Swing中的流暢動畫
我想要發生的是paintComponent
只在上次更新後調用。我可以通過使用Timer
來每隔(1000/60)ms計劃repaint()
,但我只是猜測刷新率是多少。
實際上,我想連續調用repaint
。但是如果我每秒鐘撥打repaint
200次,而且EDT不忙,它會每秒執行paintComponent
200次,這是對處理器時間的低效使用,並且可能會對應用程序的其他性能產生負面影響。
我不確定在顯示器刷新率重繪是一個好主意。但是,如果你正在尋找刷新率是什麼,你可以使用這段代碼(無恥地從互聯網上覆制)。
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for (int i = 0; i < gs.length; i++) {
DisplayMode dm = gs[i].getDisplayMode();
// Get refresh rate in Hz
int refreshRate = dm.getRefreshRate();
if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) {
// Unknown rate
} else {
System.out.println(refreshRate);
}
}
也許我真正想要做的是重新計算刷新率的動畫位置,而不是重新繪製自己,並觸發如有必要,重新繪製。 –
我認爲這樣會很好。如果精靈的數量非常複雜,那麼你可以刷新任何最合適的fps。我會建議雙緩衝來儘可能平滑動畫。 – Perception
我很確定這些天默認所有的Swing都是雙緩衝的 –
我與@little bunny foo foo
同意,你必須與操作系統延遲計算過,這個值取決於HW & SW的,那麼我的WinXp下有大約63毫秒值,overlocking這個頻率你的RepaintManager得到錯誤,爲例如JTable是非常敏感的JComponents,請閱讀更多關於Swing的繪畫paintImmediately(),repaint()defalut創建EDT 看這裏painting and javax.swing.Timer
這可能是脫離主題,但[RepaintManager'](http://download.oracle.com/javase/6/docs/api/javax/swing/RepaintManager.html)摺疊多個請求到對組件樹的成員進行一次重繪。 – mre
你確定你確實想重繪()很多次嗎?你會在JPanel內的對象中發生那麼多的變化嗎?或者你正在考慮將它移動到內部進行動畫,就像遊戲一樣? – woliveirajr
您是否無法確定何時需要重新繪製? – Perception