Próbowałem nauczyć się głębszych aspektów UE4 i podczas czytania wielu przykładów kodów, a także bazy źródłowej silnika, zauważyłem, że czasami ludzie (i sam kod źródłowy) używają standardowego float
prymitywu C ++ , ale czasami używają niestandardowej implementacji UE4 FFloat32
.
Potem się zaciekawiłem: kiedy programuję grę w Unreal, jakie są różnice między używaniem tych 2 opcji i być może w jakich głównych przypadkach należy porzucić standardowy prymityw C ++ na rzecz implementacji silnika?
c++
unreal-4
floating-point
Kim Shutter
źródło
źródło
FFloat32
.Odpowiedzi:
float
, jest dobrze zmiennoprzecinkowe w C ++.FFloat32
jest strukturą, która reprezentuje liczbę zmiennoprzecinkową, a także (za pośrednictwem unii) zdekomponowane pola bitowe dla znaku tego elementu, części mantysy i wykładnika.Zasadniczo nigdy nie należy używać,
FFloat32
z wyjątkiem sytuacji, gdy:FFloat32
(są one bardzo rzadkie) lubNie
FFloat32
jest źle , po prostu, po prostu nie oferuje niczego, czego potrzebujesz do ogólnego zastosowania zmiennoprzecinkowego.Jest mniej powszechny niż zwykły stary
float
, który ma niewielki wpływ na czytelność (inni mogą od razu nie wiedzieć, do czego służy). Nie jest też domyślnie konwertowany na,float
więc będzieszsomething.FloatValue
dużo pisać , co również nie jest wielką sprawą, ale może być nudne.Wreszcie, użycie związków i pól bitowych jest nieprzenośne i zdefiniowane w implementacji (patrz poniżej). To nie jest twój problem, zadaniem Epica jest upewnienie się, że typ jest tak skonstruowany, aby można go było używać we wszystkich obsługiwanych implementacjach, ale jest to potencjalne źródło błędów, jeśli nie wychwycą problemu z implementacją typu, gdy nowy kompilator wersja została wydana lub dodana do listy obsługiwanych kompilatorów.
Tak więc, chyba że musisz grać pojedynczymi bitami w reprezentacji zmiennoprzecinkowej, powinieneś prawdopodobnie po prostu unikać
FFloat32
(jej kuzynFFloat16
, może mieć nieco większą użyteczność, ponieważ nie ma standardowego 16-bitowego typu zmiennoprzecinkowego C ++).Kiedyś było tak powszechne manipulować pływaków pośrednictwem przedstawicielstw całkowite ich komponentów dla „ prędkość ”. Współczesne komputery eliminują wiele z potrzeby posiadania wielu platform, a różne techniki znakowania czcionkami , które mogą być użyte do tego rodzaju czynności, mogą w rzeczywistości w każdym przypadku być szkodliwe dla wydajności lub poprawności.
Warto powiedzieć, że wyszukiwanie w repozytorium GitHub Unreal ujawnia bardzo niewiele zastosowań tego
FFloat32
typu. Wszystkie są w definicjiFFloat32
siebie lub w definicjiFFloat16
.W szczególności
FFloat32
robi dwie rzeczy, które wywołuje standard C ++. To:źródło
float
nie uzyskałby czerwonego znaku zgodnego z IEEE 754 (i problemy z kompatybilnością z wieloma istniejącymi programami ).float
członka w związku, więc jeśli wfloat
rzeczywistości jest większy niż 32 bity, ogólnyFFloat32
będzie, ponieważ związek musi być wystarczająco duży, aby pomieścić największego członka. W przypadkach, gdy zmiennoprzecinkowe są większe niż cztery bajty, Epic będzie musiał zmodyfikować części pola bitowego unii, aby rozwiązać ten problem, w przeciwnym razie nie zmapują pełnego zmiennoprzecinkowego.