書くことないです。

ayamadoriが独り言を呟く日記。

画面再描画のタイミング

今書いているコードでは、画面をスクロールさせるためにpaintの中にrepaintを書くことで、再帰的?に画面を描画している。

(1文字ずつ描画していって、画面に入りきらなくなったら1行上にずらしてもう1度始めから描画していく、みたいな感じ)

ところが、スクロール時にどうも画面がちらついて見えてしまう。調べてみると、僕の期待とは異なり、どうもrepaintが現れた段階で現在のpaintを打ち切って、再度paintの始めから描画していくのではないみたいだ。repaintが現れても現在のpaintが終わらないと新しいpaintが始まらない。結果的に1度に2回描画をすることになり、これがちらつきの原因になっていると思う。

そこで、repaint()のかわりにpaint(g)を入れてみた。そうするとちらつきはなくなったんだけど、画面表示がおかしくなってしまった。どうもスクロール後の画面にスクロール前の画面が上書きされてしまってる感じ。こちらの場合、どうもpaint内でpaint(g)が現れたところで新しいpaintが始まり、それが終わってから前回(paint(g)の後に続く部分)の命令、すなわち前のpaintが行われているみたい。結局こちらでも1度に2回描画してしまっている。

javadocをみると、repaint()は再描画の要求を出すだけで、即時に再描画が行われることは保証していないから、いまのpaintスレッドが終わるのを待ってからrepaint()による命令が実行されていたと思われる。逆に、paint内にpaint(g)を書くと、内部のpaint(g)が優先されて新規のpaintが走り、現行のpaintはそれが終わるのを待ってから動き出すってことなのかな?いずれにしろ確実なことは、特に明記しない限りpaintは{}の最後まで行われるということ。

というわけでpaint内paint(g);のあとにreturn;を入れて、現在のpaintから強制的に抜け出すようにしたらうまくいきました。

ただ、いまだに分からないのはpaint内にrepaint();return;とかくと2回描画は行われないものの、やはりちらつきが見えてしまうこと。repaint()の中には画面をクリアする命令も入っていて、僕の場合paint内で強制的に画面をクリアするようにしているから、その2つがバッティングしたせいなんだろうか。
あと、上に書いた無駄に長い文はスレッドとか再帰アルゴリズムがまったく分かっていないど素人が書いたものなので、かなり間違ってるかも。識者の方、笑ってください。