何かを描画する単なるウィンドウであるプログラムがあります(計算なし、ユーザーとの対話なしなど)。このプログラムのメイン JPanel には、かなり複雑な paintComponent 関数があります。実行には約 5 ~ 10 ミリ秒かかります。
25 ミリ秒ごとに TimerTask を呼び出すタイマーを設定しました。その TimerTask は、パネルで repaint() を呼び出すだけです。そうすれば、プログラムは 40 FPS になるはずです。
ただし、パネルの paintComponent メソッドの実行には約 5 ~ 10 ミリ秒かかります。何らかの理由で、Timer は TimerTask の run() メソッドが完了するのを待ちます (つまり、パネルが再描画されるのを待ちます)。この方法では、25 ミリ秒ごとに再描画されるのではなく、30 ~ 35 ミリ秒ごとに再描画されるため、不安定で FPS が低下します。
明らかに、バックグラウンドで計算を実行したいのですが、描画を実行して残りの時間を待つのではなく、プログラムは描画を実行してから 25 ミリ秒待機するだけです。
私はutil.Timerの代わりにswing.Timerを使用しようとしましたが、うまくいきませんでした(同じでした)。
1つはBufferedImageにグラフィックを描画するためのもので、もう1つはJPanelにBufferedImageを配置するためのものです。それはパフォーマンスに関しては少し優れていましたが、ちらつきました。
では、バックグラウンドでグラフィックスを真に描画するにはどうすればよいでしょうか?