Gunakan pelampung atau ganda saat menulis game seluler

8

Saya tahu untuk shader, pelampung harus digunakan karena mereka adalah pilihan optimal untuk kinerja. Doubles lambat dan menggunakan lebih banyak memori yang tidak ideal untuk shader. Sementara float kurang akurat dan cenderung mengapung overlflows, tradeoff untuk kecepatan ideal pada perangkat keras seluler.

Tapi bagaimana dengan tempat lain di basis kode yang tidak terkait dengan pipa shader? Saya sedang menulis mesin dan menggunakan ganda untuk centang pembaruan delta dan mencoba untuk menjaga semua unit relatif terhadap tipe data sehingga ada banyak tempat menggunakan ganda. Haruskah saya menggunakan pelampung di ponsel di mesin juga?

Mesinnya ditulis dalam bahasa C ++

Dan
sumber
Saya membayangkan itu sangat tergantung pada bahasa yang Anda gunakan.
DJ Spicy Deluxe
Menambahkan C ++ dalam deskripsi
Dan

Jawaban:

14

Anda akan sulit sekali menemukan GPU seluler yang bisa menggunakan ganda bahkan jika Anda mau, sehingga sebagian dari pilihan itu cukup banyak dibuat untuk Anda.

Hanya ada beberapa tempat di mana Anda bisa mendapat manfaat dari beralih dari float presisi tunggal dalam gim Anda:

Ini akan menjadi dua contoh paling umum dari hal-hal yang tidak boleh Anda coba simpan dalam pelampung presisi tunggal, karena mereka kehilangan ketepatan yang signifikan pada rentang yang perlu Anda liput (pada detik pertama gim Anda, Anda dapat mewakili yang sudah lewat waktu ke dalam 224 detik, atau puluhan nanodetik, tetapi setelah 2,5 jam, Anda mulai kehilangan keakuratan milidetik)

Tetapi itu tidak berarti bahwa Anda harus menggunakan ganda tentunya. Tipe integer dapat menangani nilai-nilai ini dengan baik. (Int 32-bit dapat memberikan Anda akurasi milidetik selama 12 hari bermain terus-menerus. Int 64-bit akan bertahan jutaan tahun)

Nilai waktu delta biasanya berada di urutan 16 milidetik, jadi menyimpannya dalam pelampung presisi tunggal memberi Anda ketepatan sekitar229s, yang masih turun ke tingkat nanodetik - yaitu. mungkin jauh melampaui ketepatan yang Anda dapat mengatur waktu kode Anda dengan andal, memberi sinyal utas, atau tetap menyegarkan grafik Anda. Menambahkan lebih banyak presisi di sini dengan dobel tidak akan meningkatkan gim Anda dengan cara apa pun yang terukur.

Jadi Anda dapat menyimpan total waktu berlalu Anda pada presisi tinggi atau menggunakan tipe integer, menghitung delta Anda dan mengonversi ke float presisi tunggal satu kali per frame, kemudian gunakan float dengan senang hati dari sana.

Demikian pula untuk posisi. Bahkan dengan dunia yang sangat besar, jika Anda memecahnya menjadi beberapa kilometer melintasi atau kurang, maka pelampung presisi tunggal dapat menemukan posisi relatif terhadap potongan induknya dengan presisi kurang dari satu milimeter .

Offset relatif antara objek (untuk pos komputasi dan sejenisnya) umumnya baik-baik saja untuk disimpan dalam float bahkan untuk jarak yang sangat jauh. Kesalahan relatif Anda, dibandingkan dengan total panjang vektor, tetap berada dalam rentang yang terkendali.

Jadi, tidak ada banyak alasan untuk beralih ke ganda sebagai default. Saya akan mempertimbangkan itu hanya jika Anda memiliki kebutuhan yang sangat khusus, di mana Anda telah menghitung presisi float tidak akan memotongnya, dan tetap menggunakan ganda yang terkandung hanya pada bagian gim Anda yang secara aktif membutuhkannya.

DMGregory
sumber