Saat ini saya sedang menulis game menggunakan C ++ dan SDL2 dan ada satu hal yang saya ingin tahu - apakah masuk akal untuk membatasi frame per detik (FPS) dan / atau pembaruan saya per detik (UPS)?
Saya mendapatkan ide bahwa jika Anda membatasi UPS, Anda pada dasarnya mengontrol kecepatan permainan - jika pemain bergerak 1px per pembaruan dan Anda selalu memperbaruinya 30 kali per detik, dia akan bergerak pada kecepatan 30px / dtk dan Anda Mungkin juga akan meringankan CPU karena jumlah perhitungan per detik berkurang. Jika Anda membatasi FPS, jumlah drawcall per detik berkurang, karenanya Anda membebaskan GPU Anda. Saya harap saya mengerti semua itu dengan benar, jika tidak, merasa bebas untuk memperbaiki saya.
Pertanyaan saya adalah - apa yang harus saya batasi dalam permainan saya? FPS? UPS? Kedua? Bukan? Apakah ada pendekatan lain yang lebih baik untuk ini? Bagaimana ini dilakukan di sebagian besar game dan mengapa?
Jawaban sangat dihargai!
Jawaban:
Ya, itu masuk akal.
Seperti yang Anda katakan itu akan membuat lebih sedikit beban pada sistem, yang bagus untuk termal, dan aplikasi lainnya.
Namun .... Logika permainan Anda TIDAK harus bergantung pada pembaruan per detik. Oleh karena itu saya sarankan Anda untuk melihat deltatime, yang akan membuat game Anda terlepas dari pembaruan per detik.
Saya sarankan Anda untuk melihat pertanyaan ini. Ini menjelaskan dengan baik bagaimana menghitung dan menggunakannya. Cara mendapatkan dan menggunakan waktu delta
Semoga ini bisa membantu!
sumber
Jawaban terbaik adalah: Itu tergantung .
Anda tidak perlu membatasi keduanya
Pembaruan : Jika pembaruan Anda tidak terikat pada batas atas, maka logika game harus bergantung pada jumlah waktu delta , untuk menghindari menjalankan game lebih cepat atau lebih lambat tergantung pada mesin di mana ia dijalankan. Ini adalah pendekatan yang sangat umum digunakan oleh banyak game, tetapi itu bukan satu-satunya.
Rendering : Jika rendering tidak terikat pada batas atas, framebuffer mungkin disajikan dalam keadaan tidak lengkap atau salah, menyebabkan artefak robek . Inilah sebabnya mengapa banyak game menggunakan Sinkronisasi Vertikal (v-sync)
Anda mungkin membatasi keduanya
Pembaruan : Beberapa game memanfaatkan timesteps tetap untuk sebagian atau semua sistem gameplay-nya. Pendekatan ini berfungsi seperti yang telah Anda jelaskan. Jumlah Pembaruan Per Detik terbatas pada batas atas untuk memastikan hal-hal tidak bergerak terlalu cepat pada mesin kedudukan tertinggi. Ini menghilangkan kebutuhan untuk pengaturan waktu delta. Beberapa aplikasi lebih baik dengan catatan waktu tetap, beberapa dengan waktu delta. Memilih pendekatan mana yang akan sepenuhnya bergantung pada apa yang sebenarnya ingin Anda capai. Buku online GameProgrammingPatterns memiliki bab yang didedikasikan untuk loop game yang menyentuh kedua arsitektur.
Rendering : Frames Per Second harus diatur ke batas atas untuk menghindari masalah merobek yang disebutkan sebelumnya, namun, aplikasi Anda tidak boleh mencoba untuk melakukannya secara manual dengan beberapa kunci CPU. Sebagai gantinya, aktifkan v-sync dan biarkan perangkat keras yang mendasari menyinkronkan dengan refresh rate monitor. Dengan melakukan itu, game Anda akan kompatibel dengan monitor masa depan yang mungkin beroperasi pada frekuensi yang jauh lebih tinggi daripada 60Hz yang saat ini biasa. Perlu juga dicatat bahwa banyak gamer, khususnya yang menjadi tolok ukur, masih lebih suka berjalan tanpa v-sync untuk memungkinkan frame rate setinggi mungkin. Jadi masuk akal untuk mengaktifkan atau menonaktifkan fitur selama runtime.
Apa yang seharusnya tidak Anda batasi
Jika game Anda menggunakan pendekatan berbasis pemungutan suara untuk input pengguna, misalnya: memanggil
getInput()
jenis untuk memperbarui status pengontrol selama langkah pembaruan, maka ini lebih baik jika tidak terbatas. Atau jika terbatas, maka atur ke batas atas yang sangat tinggi. Semakin sering Anda meminta input pengguna dan menindaklanjutinya, semakin responsif dan halus permainan akan "terasa". Permainan 60Hz yang kita dengar saat ini tidak memperbarui AI dan semua negara di dunia pada tingkat itu, beberapa bahkan tidak merender secepat itu, tetapi mereka meminta input pengontrol setidaknya 60 kali per detik dan memperbarui avatar pemain yang sesuai. Memang ini hanya benar-benar relevan dengan game aksi serba cepat.sumber
Ada dua posting yang mungkin ingin Anda lihat:
Perbaiki Tanda Waktu Anda
Rendering fisika interpolasi
Saya menemukan diskusi pada posting benar-benar tak ternilai, tetapi menurut saya itu paling masuk akal ketika ada sejumlah penting simulasi fisika dalam permainan. Singkatnya, idenya adalah bahwa simulasi harus memiliki langkah waktu yang tetap (jika tidak, fisika bisa meledak di beberapa titik di mana delta terlalu besar), sedangkan rendering harus diberikan kebebasan untuk berjalan pada kecepatan maksimum yang dimungkinkan. Untuk menyinkronkan keduanya (simulasi dan rendering), keadaan render diinterpolasi oleh faktor yang tergantung pada seberapa jauh simulasi dari pembaruan berikut (ingat bahwa simulasi diperbaiki).
Semoga ini bisa membantu.
sumber