Tuesday, June 27, 2006

Menggambar Grafik Yang Terbebas Dari Efek Flicker Dengan Menggunakan MIDP

Yuanita Susana
202114736


Dalam pembuatan grafik sebaiknya hindarilah terjadinya flicker yang mana dapat mengakibatkan tampilan grafik yang buruk. Untuk menghilangkan efek flicker ini digunakan teknik “double buffering”. Teknik ini merupakan teknik yang umum digunakan dalam computer graphis.

Dengan menggunakan MIDP maka penggunaan teknik “double buffering” dapat dilakukan dengan mudah. Gunakan class Image ( semua class yang digunakan dalam artikel ini terdapat dalam javax.microedition.lcdui package ) untuk membuat sebuah buffer memori offscreen. Gunakan class Graphics untuk menggambar buffer offscreen. Gunakan juga class Graphics untuk meng-copy isi dari buffer offscreen ke display. Double Buffering dapat diimplementasikan hanya dengan sedikit penyesuaian pada rutin painting.

Langkah pertama yang dilakukan adalah menentukan apakah double buffering penting untuk dilakukan atau tidak. Pada beberapa implementasi, double buffering sudah didukung oleh sistem secara otomatis. Dengan kata lain, ketika sistem memanggil method paint dari object Canvas, object Graphics yang diberikan pada method adalah sebuah buffer offscreen yang diatur oleh sistem, object bukan berasal dari buffer display. Kemudian sistem menangani peng-copy-an buffer offscreen ke display. Memeriksa apakah double buffering didukung atau tidak adalah hal yang mudah, hanya tinggal memanggil method isDoubleBuffered seperti berikut ini :
public class MyCanvas extends Canvas {

private Image offscreen = null;
private int height;
private int width;

public MyCanvas(){
height = getHeight();
width = getWidth();

if( !isDoubleBuffered() ){
offscreen = Image.createImage( width, height );
}

..... // other initialization as appropriate
}

...... // other code, including paint method
}

Pada segmen program diatas, bila isDoubleBuffered menghasilkan nilai false, constructor akan membentuk sebuah buffer offscreen dengan panjang dan lebar yang sama dengan canvas. Jika display telah mendukung double buffered maka isDoubleBuffered akan menghasilkan nilai true dan buffer offscreen tidak akan terbentuk.

Buffer offscreen terbentuk dengan memanggil salah satu dari method Image.createImage. Terdapat empat method yang masing-masing mengerjakan sebagai berikut :
· Load image dari file JAR MIDlet suite.
· Membuat copy dari image yang telah ada.
· Membentuk sebuah image dari raw binary data.
· Membentuk sebuah image kosong dengan panjang dan lebar yang spesifik.
Method terakhir dari method-method diatas digunakan untuk double buffering. Sedangkan ketiga method yang lain tidak dapat digunakan untuk double buffering karena membentuk image yang tidak dapat diubah. Hanya method createImage yang terakhir, dengan mengambil parameter panjang dan lebar, dapat digunakan untuk membentuk image yang dapat diubah. Sekali mempunyai image yang dapat diubah, maka dapat memanggil method getGraphics untuk mendapatkan object Graphics yang dapat digunakan untuk menggambar pada buffer image.

Tentu saja penggambaran yang sesungguhnya terdapat pada method paint. Berikut ini adalah rutin paint yang sederhana :

protected void paint( Graphics g ){
g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, width, height );
}

untuk mengimplementasikan double buffering, tambahkan beberapa baris code sebelum dan sesudah code paint yang telah ada, seperti berikut ini :
protected void paint( Graphics g ){
Graphics saved = g;

if( offscreen != null ){
g = offscreen.getGraphics();
}

g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, width, height );

if( g != saved ){
saved.drawImage( offscreen, 0, 0,
Graphics.LEFT Graphics.TOP );
}
}


Kesimpulan :
Pada dasarnya semua yang dilakukan adalah memperoleh object Graphics untuk buffer offscreen dan menggunakannya untuk melakukan painting. Pada akhirnya, keseluruhan isi dari buffer offscreen di-copy-kan ke display. Hal ini hanya dapat dilakukan bila double buffering tidak didukung secara otomatis. Jika double buffering telah didukung secara otomatis maka dapat langsung menggambar pada display seperti biasanya.

Jika hanya membuat perubahan yang kecil pada display, penggunaan double buffering akan membuat lebih lambat. Pada beberapa peng-copy-an image sistem tidak selalu cepat dan flicker dapat terjadi meskipun telah menggunakan double buffering. Untuk penggunaan double buffering ini juga harus mengorbankan memori karena buffer memori offscreen dapat menghabiskan sejumlah besar memori. Untuk menjaga buffer offscreen menjadi minimum, dapat dilakukan dengan cara melepaskan buffer offscreen, contohnya seperti ketika canvas hidden dan mengalokasikan kembali ketika canvas ditampilkan kembali. Hal ini dapat dilakukan dengan mudah, caranya : gunakan overriding method hideNotify dan showNotify dari canvas.

Sumber :
http://java.sun.com/developer/J2METechTips/2001/tt0725.html
http://www.javaperformancetuning.com/tips/j2me.shtml#REF10
http://www.developer.com/java/j2me/article.php/10934_1561591_8

No comments: