Swing で作った Java アプリケーション マウスでなぞっている時だけスムーズに動く?
Swing で 簡単な Javaアプリケーション(ゲーム)を作ってみたところ、Windows上ではスムーズに動作するが、Linux(Ubuntu14.04) ではカクカクと表示されてしまう現象に出くわしました。
ブロック崩しのようなゲームで、ボールがウィンドウ上をあちこちに動きますが、その表示が1秒に1回程度しか更新されず、ゲームにならない。。
しかしながら、マウスでそのアプリケーションウィンドウ上をなぞるように動かすと、その間はスムーズに動作する?という不思議な現象。
初めはパソコンの画面設定、あるいはグラフィックボードなどのハードウェアの問題であるとも考えていましたが、マウスでなぞっている間はスムーズに動作する以上、やはりアプリケーション側の問題でした。
どんなキーワードでググったか忘れてしまいましたが、 同じ現象を stackoverflow に投稿されているのを見つけました。
ここでの回答の通り、 Toolkit.getDefaultToolkit().sync(); を追記すれば、マウスでなぞったりせずとも、ボールがスムーズに動作するようになりました。
ただ、この現象については、より詳しい解説が以下のサイトに記載されています。
画面の更新には、repaint()を使っていたのですが、repaint() はいつ描画するか自分で決められない、処理が重いと無視されることもあるという問題があるようです。
という訳で、今後はアクティブレンダリングという手法で画面描画処理を行うようにしたいと思います。