Saya membuat iPhone shmup dan saya sedang mencoba untuk memutuskan jenis permainan apa yang akan digunakan. Saya ingin menggunakan timestep semi-tetap atau timestep sepenuhnya-diperbaiki.
Dengan timestep semi-tetap saya akan membuat nol atau lebih pembaruan (FIXED_INTERVAL) panggilan diikuti oleh satu panggilan pembaruan (dt) di mana dt <= FIXED_INTERVAL per loop game. Seperti yang saya pahami, kelemahan dengan metode ini adalah bahwa logika pembaruan fisika (dt) saya akan lebih sulit diprogram karena pada dasarnya saya harus mengasumsikan variabel dt untuk setiap pembaruan. Dan kemudian saya juga mendengar bahwa setiap permainan saya akan sedikit berbeda karena nilai floating point tidak sama setiap waktu.
Kemudian dengan timestep yang sepenuhnya diperbaiki, saya membuat nol atau lebih pembaruan (FIXED_INTERVAL) panggilan diikuti oleh satu interpolasi (dt / FIXED_INTERVAL) panggilan di mana dt <FIXED_INTERVAL per loop permainan.
Jadi sepertinya keputusan besar yang harus saya buat adalah: apakah saya ingin mengatasi tantangan mengimplementasikan pembaruan (dt) dengan variabel dt atau apakah saya ingin mengatasi tantangan penerapan interpolasi?
Sekarang dari apa yang saya baca mayoritas orang mengatakan untuk menggunakan sepenuhnya-diperbaiki dan melakukan interpolasi. Tetapi ketika saya berpikir tentang menerapkan interpolasi sepertinya saya akan jauh lebih kompleks daripada pembaruan (dt) dengan variabel dt. Ini karena jika saya menggunakan interpolasi saya harus mengingat keadaan sebelumnya dan keadaan saat ini. Jadi jika saya ingin menggunakan interpolasi, saya harus membuat lapisan tipuan tambahan yang mengabstraksi seluruh status permainan individu. Sedangkan dengan timestep semi-tetap di mana saya tidak harus menggunakan interpolasi, saya tidak harus membuat abstraksi status permainan karena selalu ada hanya satu kondisi permainan dan itu hanyalah "array global" yang mewakili musuh saya, dan musuh peluru dll
Jadi, apa pilihan yang lebih praktis: apakah saya menerapkannya semi-tetap mengetahui bahwa pembaruan fisika saya bisa rumit dengan variabel dt. Atau apakah saya menggunakan sepenuhnya-diperbaiki dan mencoba untuk datang dengan abstraksi status permainan sehingga saya dapat melacak keadaan sebelumnya dan keadaan saat ini untuk melakukan interpolasi?
Jawaban:
Diperbaiki sepenuhnya
Anda kehilangan sebagian besar manfaat dari cap waktu tetap ketika Anda melempar langkah variabel sekali setiap frame.
Noel Lopis memiliki tulisan yang bagus tentang bagaimana dia menerapkan langkah waktu yang tetap dalam permainan Casey miliknya . Sebagai bonus untuk Anda, ia adalah pengembang iphone, meskipun tekniknya tidak spesifik untuk iphone.
Beberapa hal penting dari artikel ini
sumber
Apa yang Anda sebut sebagai timestep "semi-tetap" dan "sepenuhnya-diperbaiki" adalah, dalam pikiran saya, keduanya stempel waktu tetap - dt yang Anda berikan kepada Anda
update
panggilan Anda tidak berubah di antara frame.Jadi, pertanyaan Anda sebenarnya adalah "apakah saya ingin menerapkan interpolasi untuk keperluan rendering?" Jawabannya adalah: mungkin tidak .
Interpolasi adalah sesuatu yang Anda hanya ingin lakukan jika
update
cap waktu tetap Anda sangat berbeda denganrender
cap waktu target Anda . Ini tidak biasa untuk game yang memilikiupdate
fase berat untuk hanya meneleponupdate
, katakanlah, 10Hz, tetapi ditampilkan dengan framerate penuh.Karena Anda sedang menulis iPhone shmup, baik kebutuhan Anda
update
maupunrender
kebutuhan Anda tidak terlalu intensif menggunakan CPU; Anda dapat dengan mudah mengunci framerate hingga 30Hz atau 60Hz, tidak repot dengan implementasinya, dan masih memiliki permainan yang tampak mulus.sumber
dt
untukupdate
danrender
merupakan hal paling sederhana yang akan berhasil, tetapi umumnya dihindari ketika menggunakan mesin fisika untuk ketidakstabilan yang ditimbulkannya. Oleh karena itu, meneleponupdate
dengan tetapdt
, dan merender pada tingkat yang sama (sambil menjatuhkan frame jika Andaupdate
berjalan lama) umumnya adalah hal paling sederhana yang akan berhasil. Menulis kode untuk menginterpolasi objek di antaraupdate
panggilan menambah kompleksitas pada kode Anda; kompleksitas yang Anda tambahkan untuk menyelesaikan tanpa masalah pada khususnya.