Haruskah loop game didasarkan pada langkah waktu tetap atau variabel? Apakah seseorang selalu lebih unggul, atau apakah pilihan yang tepat bervariasi berdasarkan permainan?
Langkah waktu variabel
Pembaruan fisika diteruskan argumen "waktu berlalu sejak pembaruan terakhir" dan karenanya bergantung pada framerate. Ini mungkin berarti melakukan perhitungan sebagai position += distancePerSecond * timeElapsed
.
Kelebihan : halus, lebih mudah
dikodekan Kontra : non-deterministik, tidak dapat diprediksi pada langkah yang sangat kecil atau besar
contoh deWiTTERS :
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Memperbaiki langkah waktu
Pembaruan bahkan mungkin tidak menerima "waktu yang berlalu", karena mereka menganggap setiap pembaruan adalah untuk periode waktu yang tetap. Perhitungan dapat dilakukan sebagai position += distancePerUpdate
. Contohnya termasuk interpolasi selama render.
Kelebihan : dapat diprediksi, deterministik (lebih mudah untuk sinkronisasi jaringan?), Kode perhitungan yang lebih jelas
Kontra : tidak disinkronkan untuk memantau v-sinkronisasi (menyebabkan grafik gelisah kecuali jika Anda melakukan interpolasi), frame rate maks terbatas (kecuali jika Anda interpolasi), sulit untuk bekerja dalam kerangka kerja yang anggap langkah waktu variabel (seperti Pyglet atau Flixel )
contoh deWiTTERS :
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
Beberapa sumber daya
- Gaffer di permainan: Perbaiki cap waktu Anda!
- artikel loop game deWitter
- FPS Quake 3 memengaruhi fisika lompat — mungkin alasan mengapa Doom 3 dikunci hingga 60fps?
- Flixel membutuhkan tanda waktu variabel (saya pikir ini ditentukan oleh Flash) sedangkan Flashpunk memungkinkan kedua jenis.
- Manual Box2D § Mensimulasikan Dunia Box2D menyarankan untuk menggunakan langkah waktu yang konstan.