UPS dan FPS - Apa yang harus saya batasi dan mengapa?

11

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!

DocCoock
sumber
2
Tidak benar-benar jawaban, tetapi Anda mungkin menemukan ini berguna: gafferongames.com/game-physics/fix-your-timestep
Cypher

Jawaban:

10

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!

KaareZ
sumber
Jadi haruskah saya membatasi keduanya atau hanya salah satunya saja?
DocCoock
Keduanya, tetapi menambahkan opsi dalam pengaturan untuk menyesuaikan.
KaareZ
5
Sebuah kata dari hati-hati: jika Anda menggunakan mesin fisika, lakukan tidak bergantung pada waktu delta / variabel bingkai pembaruan seperti ini jarang didukung; mereka membutuhkan pendekatan bingkai tetap. Dan jika frame Anda banyak berfluktuasi, ini mungkin berarti Anda memiliki masalah dengan perangkat lunak Anda dan harus bertanya-tanya mengapa ini terjadi. Dengan ini, Anda dapat mempertimbangkan kembali menggunakan pendekatan DT.
Vaillancourt
1
Perhatikan bahwa menggunakan pembaruan berdasarkan waktu delta dapat menyebabkan ketidakstabilan fisika dan bug yang sangat sulit untuk direproduksi. Dalam beberapa permainan, ada trik yang hanya mungkin dilakukan pada frame rate tertentu. Inilah sebabnya mengapa fisika sering berjalan pada laju bingkai tetap. Anda selalu dapat menginterpolasi dengan kecepatan pembaruan yang lebih rendah, tetapi jika simulasi Anda tidak stabil, tidak ada yang dapat membantu Anda.
Dietrich Epp
1
Sejujurnya, saya pikir deltatime bukan ide yang baik. Saya telah menggunakannya selama bertahun-tahun, dan ia datang dengan dua masalah utama. Banyak artikel multi-pemain yang berbeda merekomendasikan untuk menggunakan langkah waktu tetap, dan jika deltatime terlalu tinggi, maka Anda dapat melakukan teleportasi melalui dinding atau bug serupa kecuali Anda memperhitungkannya.
Programmdude
6

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.

Glampert
sumber
Pembaruan saya juga terbatas secara otomatis ketika VSync diaktifkan. Oleh karena itu, saya tampaknya harus memutuskan antara masalah robek dan masalah pembaruan jajak pendapat, benar?
DocCoock
@DocCoock, jika renderer dan logika game Anda berjalan di utas yang sama, ya, mengaktifkan v-sync juga memperbaiki frekuensi pembaruan. Itulah salah satu alasan mengapa beberapa game memisahkan rendering dan logika game ke utas yang berbeda.
glampert
1

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.

Francis Moy
sumber