Kamis, 22 Januari 2015

CG[LWJGL0013] || Timing

Table of contents



System.currentTimeMillis()
Akurasi waktu sangat diperlukan untuk performa aplikasi dan game yang baik. akurasi minimal yang dibutuhkan biasanya sekitar satu detik. System.currentTimeMillis() milik java memiliki akurasi antara 1 - 55 milisecon tergantung sistem operasi yang digunakan. hal ini mengakibatkan kecepatan berbada-beda antara aplikasi yang dijalankan pada sistem operasi yang berbeda.

System.nanoTime()
Method ini mulai disediakan pada java versi 1.5 dan dapat menghasilkan akurasi millisecond. untuk mendapatkan nilai millisecond dari nilai nanosecond kita hanya perlu membagi nilai nanosecond dengan bilangan 1000000 seperti contoh berikut:


/**
 * Get the time in milliseconds
 * 
 * @return The system time in milliseconds
 */
public long getTime() {
    return System.nanoTime() / 1000000;

}

Sys.getTime()
Method Sys.getTime adalah timer resolusi tinggi milik library LWJGL dan akan mengembalikan waktu dalam bentuk "tick". nilai tick ini dapat berupa format apa saja (nanoseconds, microsecond, milliseconds, dll) yang dianggap paling baik dalam platform yang digunakan.
Untuk memperoleh nilai millisecond dari methode Sys.getTime dapat dilakukan dengan mengalikan nilai yang diperoleh dari Sys.getTime dikalikan dengan 1000 lalu dibagi dengan jumlah tick persecond seperti contoh berikut:

/**
 * Get the time in milliseconds
 * 
 * @return The system time in milliseconds
 */
public long getTime() {
    return (Sys.getTime() * 1000) / Sys.getTimerResolution();

}

Delta Time (selisih waktu)
Dalam aplikasi game seringkali kita butuhkan variabel integer yang disebut delta yang digunakan untuk menyatakan berapa besar waktu yang telah terlewati sejak frame terakhir. nilai delta ini dapat digunakan sebagai jeda untuk pergerakan entitas di dalam game. Ini juga berarti bahwa kecepatan objek harus bernilai tetap meskipun dijalankan pada platform ber beda-beda dengan fps (frame per second) berbeda pula. Berikut ini code contoh perhitungan Delta:

public int getDelta() {
    long time = getTime();
    int delta = (int) (time - lastFrame);
    lastFrame = time;         
    return delta;

}

Sleeping dan Display.sync()
Sleeping sangat penting dalam pemrograman game dan dibutuhkan agar game loop dapat bekerja secepat mungkin, disisi lain penggunaan sumberdaya sistem akan mengakibatkan pemanasan CPU/GPU dan menguras baterai. Sleeping akan memungkinkan aplikasi untuk beristirahat dan melepaskan/mengurangi sementara penggunaan resource sistem. Ada beberapa variasi game loop yang dapat dibuat menggunakan Thread.sleep() maupun Thread.yield(). meskipun demikian Library LWJGL juga menyediakan method  Display.sync (int fps) untuk lebih menyederhanakannya. Game loop ini memungkinkan program/game untuk berjalan dalam frame rate (fps) yang spesifik misalnya 60 fps dan Sleeping akan dilakukan untuk setiap extra time yang tersedia. Method Display.sync (int fps) harus dipanggil dari setiap frame. sebagai pilihan lain untuk game loop ini dapat kita gunakan Vsync tetapi tidak akan kita bahas di sini.

Menghitung FPS
Frame Per Second (FPS) menyatakan kecepatan frame dalam setiap detik. FPS dapat dihitung dengan cara melakukan incremen sebuah variabel bertipe integer pada setiap frame dan setiap satu detik nilai variabel tersebut akan ditampilkan. untuk memudahkan pemahaman ini kita akan menggunakan method Display.setTitle(String title) untuk menampilkan frame rate pada judul window OpenGL:

public void start() {
    //some startup code
    lastFPS = getTime(); //set lastFPS to current Time
}


/**
 * Calculate the FPS and set it in the title bar
 */
public void updateFPS() {
    if (getTime() - lastFPS > 1000) {
        Display.setTitle("FPS: " + fps); 
        fps = 0; //reset the FPS counter
        lastFPS += 1000; //add one second
    }
    fps++;

}

contoh code berikut ini akan menggunakan nilai delta untuk merotasi dan memindahkan Kotak ke sekitarnya melalui input dari keyboard:

preview hasilnya sebagai berikut:



SELAMAT MENCOBA




Referensi:
http://wiki.lwjgl.org/

Tidak ada komentar:

Posting Komentar

/*SYNTAX HIGHLIGHTER*/