考察


 自由課題であるThreadについてとダブルバッファリングについて考察する。

 まず、Threadについてだが、Threadとはプロセス内の実行の流れであり、スレッドの状態には新規作成、使用可能、実行中、待機中、破棄の5種類が存在し、これらが順番に推移していく。
 今回のプログラムでは「animation = new Thread(this);」の部分で新規作成し、使用可能な状態にする。つぎに、「animation.start();」で実行中の状態にし、「Thread.sleep(REFRESH_RATE);」待機させ、「animation.stop();」で破棄している。
 また、Threadの作成には次の2種類の方法がある。
 一つ目は、Threadクラスを直接拡張し、run()メソッドの中に処理を書き、起動にはThreadで拡張されたクラスをインスタンス化し、start()メソッドを呼び出す方法である。
 二つ目は、Runnableインターフェイスを実装したクラスを宣言する方法で、やはりrun()のなかに処理を書くが、起動にはRunnableで実装されたクラスをインスタンス化し、さらにThreadクラスをインスタンス化するが、このとき、コンストラクタへの引数としてさっきつくったRunnableで実装されたクラスのオブジェクトを渡し、start()を呼ぶ方法である。
今回は勉強し切れなかったが、Threadはアニメーションだけではなくさまざまな場所で使われているようである。

 次に、ダブルバッファリングについて考察する。
まず、なぜこのような手法を使うのかというと、これを使わない場合画面がちらつくからである。
 なぜちらつくのかというと、repaint()メソッドを呼ぶとJAVA Virtual Machine(JVM)によって適切なタイミングが判断され、update()メソッドが呼び出される。ここでupdate()メソッドがしていることが問題なのである。
 update()メソッドがやっていること(*最後にAppletクラスから継承しているupdate()を示す*)は「(プログラム内のほかの場所で設定された)背景の色と同じ色を設定し、そこにアプレットと同じ大きさの長方形を描き(ここで画面は消去される)、その上にpaint()で指定した物体を描いていく、ということであるが、問題は背景の色と描きたい物体の色の切り替えが頻繁に起こることであり、このために画面がちらつくのだ。
 そこで、ちらつきを消す方法としてupdate()メソッドをオーバーライドしてpaint()だけを呼び出すようにする。しかし、これでは以前に描かれた物体は消去されないために後ろに痕跡が残ってしまう。そこで、ダブルバッファリングではオフスクリーンバッファにすべての描きたい物体を描き、そ れをウィンドウにコピーをする。
 今回どのように使われたかをみてみると、ComponentクラスのcreateImage()メソッドを用いてオフスクリーンバッファを作成し、このバッファのグラフィックコンテクストはImageのgetGraphics()メソッドを使って取得する。先に述べたようにupdate()メソッドはpaint()メソッドのみを呼び出すようにオーバーライドし、そのpaint()メソッド内部ではoffscreenに対して物体を描いていき、最後にdrawImage()メソッドを用いてウィンドウを更新する。このままではやはり痕跡が残ってしまうような気がするが、paint()メソッド内で初めにアプレットと同じ大きさの長方形を描いているので痕跡は残らない。


//update()の中身
 public void update(Graphics g){
    g.setColor(getBackground());
    g.fillRect(0,0,width,height);
    g.setColor(Foreground());
    paint(g);
 }


TOPに戻る