Ich habe versucht, einige tiefere Aspekte von UE4 zu lernen, und während ich viele Beispielcodes und auch die Quellbasis der Engine las, bemerkte ich, dass manchmal Leute (und der eigentliche Quellcode) das Standard-C ++ float
- Grundelement verwenden, aber manchmal die benutzerdefinierte Implementierung von UE4 verwenden FFloat32
.
Dann wurde ich neugierig: Wenn ich ein Spiel mit Unreal programmiere, was sind die Unterschiede zwischen der Verwendung dieser beiden Optionen und was sind möglicherweise die Hauptfälle, in denen man das Standard-C ++ - Grundelement zugunsten der Implementierung der Engine fallen lassen sollte?
c++
unreal-4
floating-point
Kim Shutter
quelle
quelle
FFloat32
.Antworten:
float
ist gut, ein C ++ - Gleitkomma.FFloat32
ist eine Struktur, die einen Float sowie (über eine Vereinigung) die zerlegten Bitfelder für die Vorzeichen-, Mantissen- und Exponententeile dieses Floats darstellt.Sie sollten im Allgemeinen nie verwenden,
FFloat32
außer wenn:FFloat32
(diese sind sehr selten) oderEs ist nicht das
FFloat32
ist schlecht , per se, es ist nur , dass sie nicht wirklich bieten Ihnen alles , was Sie für allgemeine Zwecke bräuchten Punkt Nutzung schweben.Es ist weniger verbreitet als ein einfaches altes Gerät
float
, das geringfügige Auswirkungen auf die Lesbarkeit hat (andere wissen möglicherweise nicht sofort, wofür es gedacht ist). Es wird auch nicht implizit in konvertiert,float
sodass Siesomething.FloatValue
viel tippen, was ebenfalls keine große Sache ist, aber langweilig werden kann.Schließlich ist die Verwendung von Gewerkschaften und Bitfeldern nicht portierbar und von der Implementierung abhängig (siehe unten). Dies ist nicht Ihr Problem. Es ist Aufgabe von Epic, sicherzustellen, dass der Typ so strukturiert ist, dass er für alle unterstützten Implementierungen verwendet werden kann. Es kann jedoch zu Fehlern kommen, wenn bei einem neuen Compiler kein Problem mit der Implementierung des Typs festgestellt wird Version wird freigegeben oder zur Liste der unterstützten Compiler hinzugefügt.
Wenn Sie also nicht mit den einzelnen Bits in der Gleitkommadarstellung spielen müssen, sollten Sie dies wahrscheinlich vermeiden
FFloat32
(sein CousinFFloat16
, könnte etwas nützlicher sein, da es keinen Standard-16-Bit-C ++ - Gleitkommatyp gibt).Früher war es üblich, Floats über ganzzahlige Darstellungen ihrer Komponenten für " Geschwindigkeit " zu manipulieren . Moderne Computer machen viele Plattformen überflüssig, und die verschiedenen Typ-Punning- Techniken, die verwendet werden könnten, um solche Dinge zu tun, können in jedem Fall die Leistung oder Korrektheit beeinträchtigen.
Es sollte aufschlussreich sein, dass eine Suche im GitHub-Repository von Unreal nur sehr wenige Verwendungen des
FFloat32
Typs aufdeckt . Alle von ihnen sind in der Definition von sichFFloat32
selbst oder in der Definition vonFFloat16
.Tut speziell
FFloat32
zwei Dinge, die der C ++ - Standard aufruft. Es:quelle
float
, keine IEEE 754-konforme rote Markierung erhält (und Kompatibilitätsprobleme mit vielen vorhandenen Programmen auftreten ).float
Mitglied in der Gewerkschaft. Wennfloat
also tatsächlich mehr als 32 Bit vorhanden sind, ist dies auch insgesamtFFloat32
der Fall, da die Gewerkschaft groß genug sein muss, um das größte Mitglied aufzunehmen. In Fällen, in denen Floats größer als vier Bytes sind, musste Epic auch die Bitfeldteile der Union ändern, um dies zu beheben. Andernfalls werden sie nicht den vollständigen Float abbilden.