Double Buffering untuk Mengatasi “Flickering” di JAVA Applet

“Flickering” atau gambar yang berkedip merupakan masalah yang umum terjadi ketika membuat objek dan animasi di JAVA applet menggunakan AWT library. Berikut ini contoh kode untuk animasi sederhana di JAVA applet:

import java.applet.*;
import java.awt.*;
public class AnimasiBola extends Applet implements Runnable
{
   int x_pos = 10; 

   int y_pos = 100; 
   int radius = 20; 

public void init() 

   setBackground (Color.blue); 
 } 

public void start ()

   Thread th = new Thread (this); 
   th.start (); 
 } 

public void run () 

   Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

   while (true) 
   { 
        x_pos ++; 
        repaint(); 

        try 
        { 
             Thread.sleep (20); 
         } 
        catch (InterruptedException ex) { } 

       Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
   } 
 } 

public void paint (Graphics g) 
 { 
     g.setColor (Color.red); 
     g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius); 
  } 
}

Jika kode diatas dijalankan, animasi pada layar terlihat kurang “smooth”, terlihat seakan-akan gambar berkedip sekian detik. Hal inilah yang sering disebut dengan istilah “flickering”. Sedangkan penjelasan sederhana dari fenomena “flickering” adalah:

  • Ketika method repaint() dipanggil, method update() akan dijalankan.
  • Method update() secara default akan membersihkan tampilan layar kemudian memanggil method paint(). Method paint() inilah yang bertugas membentuk objek.
  • Karena ada mekanisme “bersihkan layar” dari method update() maka terjadi jeda waktu sekian milidetik antara tampilan layar yang dibersihkan dengan penggambaran kembali objek di layar.

Hal inilah yang mengakibatkan gambar objek berkedip. Untuk mengatasi hal tersebut, ada suatu cara yang cukup mudah yaitu dengan menggunakan ‘double buffering‘. Prinsip double buffering adalah sebagai berikut:

Analogikan layar JAVA applet terdiri dari dua screen layer, background layer dan foreground layer. Segala hal yang ada di background tidak akan terlihat jika ada objek di foreground di posisi yang sama. Ketika repaint() dipanggil, method update() membuat sebuah gambar di background, gambar yang dibuat sama dengan gambar objek yang akan ditampilkan di foreground. Selanjutnya gambar di background diduplikasikan ke foreground. Sehingga jeda waktu ketika layar dibersihkan akan terisi oleh gambar dari background.

Double buffering dilakukan di dalam method update(). Berikut ini contoh kode double buffering dari website ini :

public void update (Graphics g) {
// initialize buffer

if (dbImage == null) {

dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics (); }

// clear screen in background
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

// draw elements in background
dbg.setColor (getForeground());
paint (dbg);

// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}

Leave a comment

Your email address will not be published. Required fields are marked *