Saya pernah membaca bahwa kecepatan objek game tidak boleh terhalang oleh FPS tetapi harus berdasarkan waktu. Bagaimana saya bisa memisahkan kode pembaruan / menggambar untuk memaksimalkan kinerja tanpa membatasi kecepatan menggambar dan memberikan tingkat pembaruan logika konstan berdasarkan waktu?
Kode pseudo saya saat ini adalah sebagai berikut
loop
{
draw();
if (ticksElapsed() > 100)
{
update();
ticks+= ticksElapsed();
}
}
Masalahnya adalah kode gambar menghalangi kinerja tingkat pembaruan (). Dan ia mengkonsumsi 100% cpu karena jika tidur dilemparkan, ia membuang kedua fungsi menggambar / logika.
Saya juga menggunakan SDL dan sepertinya tidak memiliki opsi vsync. Saya juga pernah mendengar tentang istilah yang tetap dan variabel loncatan waktu namun saya tidak yakin bagaimana hal itu dapat dilakukan dengan tidur ()
sdl
frame-rate
logic
fixed-timestep
Oskenso Kashi
sumber
sumber
Jawaban:
Dalam cuplikan kode Anda, sepertinya Anda mencoba menjalankan game dalam mode langkah waktu tetap dengan sibuk menunggu jika menggambar dan memperbarui kurang dari 15 ms (60fps). Ini mungkin dan Anda menebak dengan benar bahwa ini tidak dapat dilakukan dengan menggunakan panggilan tidur karena Anda tidak tahu persis berapa lama Anda akan tidur. Loop sibuk-menunggu adalah solusi yang baik.
Namun pertimbangkan kasus di mana pembaruan dan menggambar Anda melebihi 15 ms, Anda sekarang memiliki permainan menggambar dan memperbarui menjadi lambat. Sekarang Anda dapat melakukan dua hal: mendeteksi keadaan ini dan menjatuhkan bingkai (lewati menggambar dan langsung memperbarui hingga Anda kembali sinkron) namun jika komputer melambat maka komputer tidak akan pernah mengejar.
Solusi lain adalah membuat logika pembaruan Anda tidak tergantung waktu. Anda tidak perlu utas terpisah untuk ini, Anda hanya perlu merespek seberapa cepat hal-hal harus bergerak. Alih-alih 5pixels per tick, Anda harus menggunakan 50pixels per detik. Anda akan memerlukan penghitung waktu presisi tinggi untuk mencapai hal ini, dan semua logika pembaruan Anda harus dapat mengakses penghitung waktu untuk melihat berapa banyak waktu yang berlalu sejak pembaruan terakhir.
Pada dasarnya Anda pergi dari:
Untuk
sumber