Thursday, 10 December 2009

SDL : Istirahat Sejenak

Kalau program berikut kita kompilasi/build :

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

int main ( int argc, char** argv )
{
if( SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return 1;
}

SDL_Surface *screen = NULL;
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);

if( screen == NULL)
{
return 1;
}

bool selesai = false;
while( selesai == false)
{
SDL_Event event;
while( SDL_PollEvent(&event))
{
switch( event.type)
{
case SDL_QUIT: selesai = true; break;
case SDL_KEYDOWN:
if( event.key.keysym.sym == SDLK_ESCAPE)
{
selesai = true;
} break;
default:;
}
}
SDL_FillRect(screen,0, SDL_MapRGB(screen->format,0,0,255));
SDL_Flip(screen);
}

SDL_Quit();
return 0;
}
Lalu dijalankan dapat dipastikan program akan menggunakan CPU Usage (di Windows dapat dilihat dengan Task Manager - [Ctrl]+[Alt]+[Del]) sebesar 100% alias hampir semuanya digunakan. Bukan berarti program kita amat sangat berat (padahal cuma nampilin layar warna biru polos) tapi karena prosesnya berjalan terus tanpa ada istirahat. Frame yang dihasilkan setiap detiknya sesuai dengan kemampuan komputer untuk mengolahnya, bisa 20, bisa 100 atau 1000 lebih!. Kalau game kita terlalu cepat bisa bikin permainan kurang nyaman begitu pula kalau terlalu lambat (kalau CPU Usage 100% tapi lambat nggak perlu istirahat lagi, soalnya komputer lagi sibuk ngolah! - perlu optimasi!! ). Kalau sudah begitu Frame Per Second (fps) atau Frame Rate harus turun tangan. Membuat fps gampang kok, berikut kodenya:

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

int main ( int argc, char** argv )
{
if( SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return 1;
}

SDL_Surface *screen = NULL;
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);

if( screen == NULL)
{
return 1;
}

//membuat variabel fps (frame per second)
//dan jumlah frame setiap detiknya adalah 20
int fps = 0;
const int frame_per_second = 20;

bool selesai = false;
while( selesai == false)
{
//memperoleh sekian milidetik dari SDL_GetTicks()
fps = SDL_GetTicks();

SDL_Event event;
while( SDL_PollEvent(&event))
{
switch( event.type)
{
case SDL_QUIT: selesai = true; break;
case SDL_KEYDOWN:
if( event.key.keysym.sym == SDLK_ESCAPE)
{
selesai = true;
} break;
default:;
}
}
SDL_FillRect(screen,0, SDL_MapRGB(screen->format,0,0,255));
SDL_Flip(screen);

//perhitungan frame rate
int getDetik = SDL_GetTicks() - fps;
if( getDetik < (1000/frame_per_second)){
SDL_Delay((1000/frame_per_second) - getDetik);
}
}

SDL_Quit();
return 0;
}
Pertama kita membuat variabel (fps) untuk menampung waktu berupa milidetik dari SDL_GetTicks(). Lalu setelah sampai di ujung pengulangan program akan istirahat jika pekerjaannya sudah beres sesuai waktu yang ditentukan. Dalam contoh diatas program harus menampilkan 20 frame (putaran pengulangan) setiap detiknya. Atau sekitar 50 milidetik setiap framenya, jika program menyelesaikannya dalam 15 milidetik itu berarti program punya waktu 35 milidetik untuk istirahat. Tetapi tidak sebaliknya jika program menyelesaikan dalam 50 atau lebih milidetik. Selanjutnya membandingkan dengan variabel getDetik seberapa banyak milidetik yang diperlukan setiap frame. Misalnya fps bernilai 12300 milidetik, lalu getDetik bernilai (misal) 20 didapat dari nilai SDL_GetTicks() saat ini misalnya 12320 dan dikurangi fps (12300). Jika getDetik (20) lebih kecil dari 50 (1000/20) maka program dapat istirahat sebanyak sisa waktu yaitu 30 milidetik (1000/20 - 20). Moga-moga bener perhitungannya hahah... . Berikut deklarasi SDL_GetTicks() :

/* Get the number of milliseconds since the SDL library initialization.
* Note that this value wraps if the program runs for more than ~49 days.
*/
extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);


- krofz

No comments:

Post a Comment

Maaf jika komentar anda lama terbitnya ^__^, penulis berusaha OL sesering mungkin. Komentar anda adalah semangat blog ini, dan juga semangat para blogger lainnya. You can use XHTML tags: <a href="" rel="link"> </a>, <strong> </strong>, <b> </b>, <em> </em>, <i> </i>.

Spesial character use :
&lt; for <
&gt; for >


Use Pastebin.com for alternative to display your code :) .

 

back to top

back to top