Saya telah mencoba mempelajari beberapa aspek yang lebih dalam dari UE4 dan ketika membaca banyak contoh kode dan juga basis sumber dari mesin, saya perhatikan bahwa kadang-kadang orang (dan kode sumber) menggunakan standar C ++ float
primitif, tetapi kadang-kadang menggunakan implementasi kustom UE4 FFloat32
.
Lalu saya jadi penasaran: ketika memprogram permainan dengan Unreal, apa perbedaan antara menggunakan 2 opsi itu dan mungkin apa kasus utama ketika seseorang harus menjatuhkan standar C ++ primitif demi implementasi mesin?
c++
unreal-4
floating-point
Kim Shutter
sumber
sumber
FFloat32
.Jawaban:
float
, adalah titik mengambang C ++.FFloat32
adalah struktur yang mewakili float serta (melalui penyatuan) bitfields yang terurai untuk tanda float itu, mantissa dan bagian eksponen.Anda umumnya tidak boleh menggunakan
FFloat32
kecuali ketika:FFloat32
(ini sangat jarang) atauIni bukan berarti bahwa
FFloat32
adalah buruk , per se, itu hanya bahwa itu tidak benar-benar menawarkan apa pun yang Anda akan perlu untuk tujuan umum floating penggunaan titik.Ini lebih jarang daripada yang biasa
float
, yang memiliki beberapa dampak keterbacaan kecil (yang lain mungkin tidak tahu langsung untuk apa sekilas pandang). Ini juga tidak secara implisit dikonversi kefloat
sehingga Anda akan banyak mengetiksomething.FloatValue
, yang juga bukan masalah besar, tetapi bisa membosankan.Akhirnya, penggunaan serikat pekerja dan bitfields adalah non-portabel, dan implementasi-didefinisikan (lihat di bawah). Ini bukan masalah Anda , itu adalah tugas Epic untuk memastikan tipe terstruktur sehingga dapat digunakan untuk semua implementasi yang didukung, tetapi ini merupakan sumber bug potensial jika mereka gagal menangkap masalah dengan implementasi tipe ketika kompiler baru versi dirilis atau ditambahkan ke daftar kompiler yang didukung.
Jadi, kecuali Anda memiliki kebutuhan untuk bermain dengan bit individu dalam representasi floating point, Anda mungkin harus menghindari
FFloat32
(sepupunyaFFloat16
,, mungkin memiliki utilitas sedikit lebih karena tidak ada standar 16-bit C ++ tipe floating point).Dulu umum untuk memanipulasi pelampung melalui representasi integer dari komponen mereka untuk " kecepatan ." Komputer modern menyingkirkan banyak kebutuhan itu untuk banyak platform, dan berbagai jenis teknik penghukuman yang dapat digunakan untuk melakukan hal semacam ini sebenarnya dapat merusak kinerja atau kebenaran dalam peristiwa apa pun.
Seharusnya memberitahu bahwa pencarian repositori Unit's GitHub mengungkapkan sangat sedikit kegunaan dari
FFloat32
tipe tersebut. Semuanya dalam definisiFFloat32
itu sendiri atau dalam definisiFFloat16
.Secara khusus,
FFloat32
melakukan dua hal yang disebut oleh standar C ++. Itu:sumber
float
akan mendapatkan tanda merah yang memenuhi syarat IEEE 754 (dan masalah kompatibilitas dengan banyak perangkat lunak yang ada) ).float
anggota dalam serikat pekerja, jadi jikafloat
sebenarnya lebih besar dari 32 bit, keseluruhannyaFFloat32
akan baik karena serikat pekerja harus cukup besar untuk menampung anggota terbesar. Dalam kasus di mana float lebih besar dari empat byte, Epic harus memodifikasi bagian bitfield dari union juga untuk mengatasinya, jika tidak mereka tidak akan memetakan float lengkap.