Tanda waktu semi-tetap atau Sepenuhnya-diperbaiki?

15

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?

Ryan
sumber
Tercakup cukup menyeluruh di sini: gamedev.stackexchange.com/questions/1589/…
michael.bartnett
1
Saya sudah membaca diskusi itu dan tautannya di sana beberapa kali. Sebenarnya bagaimana saya sampai di pos ini. Pertanyaan saya terutama berkaitan dengan bagaimana menerapkan status permainan untuk mencapai interpolasi - yang tidak dibahas sama sekali dalam diskusi itu.
Ryan

Jawaban:

12

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

  • Gunakan akumulator waktu.
  • Gunakan laju fisika 120Hz untuk frame rate 60Hz.
  • Mensimulasikan satu langkah tetap ke masa depan dan menggunakan akumulasi sisa waktu untuk menggambar kode lerp antara keadaan fisika saat ini dan keadaan fisika masa depan.
  • berbagai gotcha
deft_code
sumber
2

Apa yang Anda sebut sebagai timestep "semi-tetap" dan "sepenuhnya-diperbaiki" adalah, dalam pikiran saya, keduanya stempel waktu tetap - dt yang Anda berikan kepada Andaupdate 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 updatecap waktu tetap Anda sangat berbeda dengan rendercap waktu target Anda . Ini tidak biasa untuk game yang memiliki updatefase berat untuk hanya meneleponupdate , katakanlah, 10Hz, tetapi ditampilkan dengan framerate penuh.

Karena Anda sedang menulis iPhone shmup, baik kebutuhan Anda updatemaupun renderkebutuhan 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.

Blair Holloway
sumber
Saya tidak mengerti. Anda bilang saya bisa mengunci dt besar yang akan saya hitung di loop permainan saya - yang dikonsumsi fisika saya? Bagaimana aku melakukan itu? Bisakah saya melakukannya dengan CADisplayLink? Maksud saya, berapa% CPU yang Anda anggap saya gunakan? Haruskah Anda benar-benar menganggap game dt loop terkunci?
Ryan
Apa yang saya katakan benar-benar bermuara pada hal ini: lakukan hal yang paling tidak rumit yang akan berhasil.
Blair Holloway
1
Elaborasi: menggunakan variabel dtuntuk updatedan rendermerupakan hal paling sederhana yang akan berhasil, tetapi umumnya dihindari ketika menggunakan mesin fisika untuk ketidakstabilan yang ditimbulkannya. Oleh karena itu, menelepon updatedengan tetap dt, dan merender pada tingkat yang sama (sambil menjatuhkan frame jika Anda updateberjalan lama) umumnya adalah hal paling sederhana yang akan berhasil. Menulis kode untuk menginterpolasi objek di antara updatepanggilan menambah kompleksitas pada kode Anda; kompleksitas yang Anda tambahkan untuk menyelesaikan tanpa masalah pada khususnya.
Blair Holloway