スレッドとアニメーション (7/9)
作成:2010-01-14 21:14
更新:2010-01-14 21:14
更新:2010-01-14 21:14
■オフスクリーンバッファに描画する
ここまでは描画メソッドを使って図形を描いてきましたが、グラフィックファイルからイメージを読み込んでも同様のことができるはずです。今度は、それについて考えてみましょう。
イメージを使って描く時、問題となるのは「描画の時間差」です。 先の例では、ごく単純に「円を描く」というだけのものでしたから、なめらかに表示されました。が、イメージを使った場合、どうなるでしょう。特に「背景に何かのイメージを表示し、その上に重ねて何かを表示する」なんて場合は?
画面をクリアし、それから背景を描き、その後で重ね合わせるイメージを描き…という処理を順番に行なっていくと、画面が妙にちらちらとしてしまうことがあります。これは「描きなおしている処理が見えてしまう」からです。例えば背景を描いてから重ねるイメージを描く場合、ほんの一瞬ですが背景だけで重ねるイメージが描かれていない状態になるわけです。これによりちらつき感が出てしまうことはあります。
また、通常のコンポーネントは、画面更新をする際にまず全体を背景色で塗りつぶしてコンポーネントの描画を行なってからpaintメソッドを呼び出します。ここでもちらつきが生じる可能性はあります。
そこで、「一度に全部表示を更新する」という処理が必要となるのです。これは、実はそう難しいものではありません。要するに、複数のイメージを順番に描くのが悪いのです。ですから、まずからっぽ(?)のイメージを1つ用意し、その中に順番に表示するものを描いていって、全部描き終えたところでこれを画面に描くようにすれば、ちらつきはなくなります。
このような「画面に表示されないイメージ」を「オフスクリーンバッファ」と呼びます。オフスクリーンバッファを使えば、画面のちらつきをおさえてきれいなアニメーションができます。
このオフスクリーンバッファというのは、特別なオブジェクトではありません。イメージに使っていたImageクラスのインスタンスをそのまま利用するのが一般的です。先にImageを使った時は、getImgeというのでイメージを読み込んでいましたが、この他にcreateImageというメソッドで、何もグラフィックのないからっぽなImageインスタンスを作ることもできるようになっています。
整理すると、オフスクリーンバッファの考え方は以下のようになります。
1.表示するイメージをgetImageでそれぞれ読み込む。
2.それとは別に、オフスクリーンバッファ用のImageをcreateImageで作る。
3. runメソッドでは、位置を動かした後、オフスクリーンバッファのImageにdrawImageで表示イメージを描いてから、repaintを呼び出す。
4.MyCanvasのpaintメソッドでは、オフスクリーンバッファのImageを丸ごとdrawImageする。
この他に、MyCanvasでupdateメソッドを修正するという作業も必要となるでしょう。前回触れたように、AWTのコンポーネントでは、repaintされた後、updateでコンポーネントを更新し、それからpaintを呼び出します。ですから、updateを、直接paintを呼び出すような形に修正すれば、更にちらつきの原因はなくなります。
イメージを使って描く時、問題となるのは「描画の時間差」です。 先の例では、ごく単純に「円を描く」というだけのものでしたから、なめらかに表示されました。が、イメージを使った場合、どうなるでしょう。特に「背景に何かのイメージを表示し、その上に重ねて何かを表示する」なんて場合は?
画面をクリアし、それから背景を描き、その後で重ね合わせるイメージを描き…という処理を順番に行なっていくと、画面が妙にちらちらとしてしまうことがあります。これは「描きなおしている処理が見えてしまう」からです。例えば背景を描いてから重ねるイメージを描く場合、ほんの一瞬ですが背景だけで重ねるイメージが描かれていない状態になるわけです。これによりちらつき感が出てしまうことはあります。
また、通常のコンポーネントは、画面更新をする際にまず全体を背景色で塗りつぶしてコンポーネントの描画を行なってからpaintメソッドを呼び出します。ここでもちらつきが生じる可能性はあります。
そこで、「一度に全部表示を更新する」という処理が必要となるのです。これは、実はそう難しいものではありません。要するに、複数のイメージを順番に描くのが悪いのです。ですから、まずからっぽ(?)のイメージを1つ用意し、その中に順番に表示するものを描いていって、全部描き終えたところでこれを画面に描くようにすれば、ちらつきはなくなります。
このような「画面に表示されないイメージ」を「オフスクリーンバッファ」と呼びます。オフスクリーンバッファを使えば、画面のちらつきをおさえてきれいなアニメーションができます。
このオフスクリーンバッファというのは、特別なオブジェクトではありません。イメージに使っていたImageクラスのインスタンスをそのまま利用するのが一般的です。先にImageを使った時は、getImgeというのでイメージを読み込んでいましたが、この他にcreateImageというメソッドで、何もグラフィックのないからっぽなImageインスタンスを作ることもできるようになっています。
整理すると、オフスクリーンバッファの考え方は以下のようになります。
1.表示するイメージをgetImageでそれぞれ読み込む。
2.それとは別に、オフスクリーンバッファ用のImageをcreateImageで作る。
3. runメソッドでは、位置を動かした後、オフスクリーンバッファのImageにdrawImageで表示イメージを描いてから、repaintを呼び出す。
4.MyCanvasのpaintメソッドでは、オフスクリーンバッファのImageを丸ごとdrawImageする。
この他に、MyCanvasでupdateメソッドを修正するという作業も必要となるでしょう。前回触れたように、AWTのコンポーネントでは、repaintされた後、updateでコンポーネントを更新し、それからpaintを呼び出します。ですから、updateを、直接paintを呼び出すような形に修正すれば、更にちらつきの原因はなくなります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
※関連コンテンツ