Saya baru-baru ini membaca artikel ini di Game Loops: http://www.koonsolo.com/news/dewitters-gameloop/
Dan implementasi terakhir yang direkomendasikan sangat membingungkan saya. Saya tidak mengerti cara kerjanya, dan sepertinya berantakan total.
Saya mengerti prinsipnya: Perbarui game dengan kecepatan konstan, dengan apa pun yang tersisa membuat game sebanyak mungkin.
Saya kira Anda tidak bisa menggunakan:
- Dapatkan input untuk 25 ticks
- Render game untuk 975 ticks
Pendekatan karena Anda akan mendapatkan input untuk bagian pertama dari yang kedua dan ini akan terasa aneh? Atau apakah itu yang terjadi dalam artikel?
Pada dasarnya:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
Bagaimana itu bahkan valid?
Mari kita asumsikan nilainya.
MAX_FRAMESKIP = 5
Mari kita asumsikan next_game_tick, yang diberikan beberapa saat setelah inisialisasi, sebelum loop game utama mengatakan ... 500.
Akhirnya, karena saya menggunakan SDL dan OpenGL untuk game saya, dengan OpenGL yang digunakan untuk rendering saja, mari kita asumsikan bahwa GetTickCount()
mengembalikan waktu sejak SDL_Init dipanggil, yang memang berhasil.
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
Sumber: http://www.libsdl.org/docs/html/sdlgetticks.html
Penulis juga mengasumsikan ini:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
Jika kami memperluas while
pernyataan yang kami dapatkan:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750 karena waktu telah berlalu sejak next_game_tick
ditugaskan. loops
adalah nol seperti yang Anda lihat di artikel.
Jadi kita telah memasuki loop while, mari kita lakukan beberapa logika dan menerima beberapa input.
Yadayadayada.
Di akhir loop sementara, yang saya ingatkan Anda ada di dalam loop game utama kami adalah:
next_game_tick += SKIP_TICKS;
loops++;
Mari kita perbarui seperti apa iterasi selanjutnya dari kode sementara
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000 karena waktu telah berlalu mendapatkan input dan melakukan hal-hal sebelum kita mencapai ineterasi loop berikutnya, di mana GetTickCount () dipanggil kembali.
540 karena, dalam kode 1000/25 = 40, oleh karena itu, 500 + 40 = 540
1 karena perulangan kita telah diulang satu kali
5 , kamu tahu kenapa.
Jadi, karena loop Sementara ini JELAS tergantung MAX_FRAMESKIP
dan tidak dimaksudkan TICKS_PER_SECOND = 25;
bagaimana game seharusnya berjalan dengan benar?
Tidak mengherankan bagi saya bahwa ketika saya menerapkan ini ke dalam kode saya, dengan benar saya dapat menambahkan karena saya hanya mengubah nama fungsi saya untuk menangani input pengguna dan menggambar permainan dengan apa yang penulis artikel dalam kode contohnya, permainan tidak melakukan apa pun .
Saya menempatkan fprintf( stderr, "Test\n" );
di dalam loop sementara yang tidak bisa dicetak sampai permainan berakhir.
Bagaimana putaran game ini berjalan 25 kali per detik, dijamin, sambil merender secepat mungkin?
Bagi saya, kecuali saya kehilangan sesuatu BESAR, sepertinya ... tidak ada.
Dan bukankah struktur ini, dari loop sementara ini, seharusnya berjalan 25 kali per detik dan kemudian memperbarui permainan persis seperti yang saya sebutkan sebelumnya di awal artikel?
Jika itu masalahnya mengapa kita tidak bisa melakukan sesuatu yang sederhana seperti:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
Dan hitung interpolasi dengan cara lain.
Maafkan pertanyaan saya yang sangat panjang, tetapi artikel ini telah melakukan lebih banyak kerusakan daripada kebaikan bagi saya. Saya sangat bingung sekarang - dan tidak tahu bagaimana menerapkan loop game yang tepat karena semua pertanyaan ini muncul.