J'ai essayé d'apprendre certains aspects plus profonds de UE4 et en lisant de nombreux exemples de codes et également la base source du moteur, j'ai remarqué que parfois les gens (et le code source même) utilisent la float
primitive C ++ standard , mais utilisent parfois l'implémentation personnalisée de UE4 FFloat32
.
Ensuite, je suis devenu curieux: lors de la programmation d'un jeu avec Unreal, quelles sont les différences entre l'utilisation de ces 2 options et éventuellement quels sont les principaux cas où l'on devrait abandonner la primitive C ++ standard en faveur de l'implémentation du moteur?
c++
unreal-4
floating-point
Kim Shutter
la source
la source
FFloat32
.Réponses:
float
, est bien, une virgule flottante C ++.FFloat32
est une structure qui représente un flotteur ainsi que (via une union) les champs de bits décomposés pour le signe, la mantisse et les parties exposantes de ce flotteur.Vous ne devez généralement jamais utiliser
FFloat32
sauf lorsque:FFloat32
(ce sont très rares) ouCe n'est pas
FFloat32
est mauvais , en soi, il est juste que ça n'a pas vraiment vous offrir tout ce dont vous auriez besoin pour usage général flottant utilisation ponctuelle.Il est moins courant qu'un ancien simple
float
, ce qui a un impact mineur sur la lisibilité (d'autres peuvent ne pas savoir immédiatement à quoi il sert en un coup d'œil). Il ne se convertit pas non plus implicitement enfloat
donc vous taperezsomething.FloatValue
beaucoup, ce qui n'est pas non plus un gros problème, mais pourrait devenir fastidieux.Enfin, son utilisation des unions et des champs de bits est non portable et définie par l'implémentation (voir ci-dessous). Ce n'est pas votre problème, c'est le travail d'Epic de s'assurer que le type est structuré de manière à ce qu'il soit utilisable pour toutes les implémentations prises en charge, mais c'est une source potentielle de bogues s'ils ne parviennent pas à résoudre un problème avec l'implémentation du type lorsqu'un nouveau compilateur version est publiée ou ajoutée à la liste des compilateurs pris en charge.
Donc, à moins que vous n'ayez besoin de jouer avec les bits individuels dans la représentation en virgule flottante, vous devriez probablement éviter
FFloat32
(son cousinFFloat16
, peut avoir un peu plus d'utilité car il n'y a pas de type à virgule flottante C ++ 16 bits standard).Autrefois, il était courant de manipuler des flotteurs via des représentations entières de leurs composants pour la " vitesse ". Les ordinateurs modernes évitent une grande partie de ce besoin pour de nombreuses plates-formes, et les diverses techniques de punition de type qui pourraient être utilisées pour faire ce genre de chose peuvent en fait nuire aux performances ou à l'exactitude en tout état de cause.
Il devrait être révélateur qu'une recherche dans le référentiel GitHub d'Unreal révèle très peu d'utilisations du
FFloat32
type. Tous sont dans la définition deFFloat32
soi ou dans la définition deFFloat16
.Plus précisément,
FFloat32
fait deux choses que la norme C ++ appelle. Il:la source
float
ne recevrait pas de marque rouge conforme IEEE 754 (et des problèmes de compatibilité avec de nombreux logiciels existants ).float
membre dans l'union, donc s'ilfloat
est en réalité plus grand que 32 bits, la valeur globale leFFloat32
sera également puisque l'union doit être suffisamment grande pour contenir le plus grand membre. Dans les cas où les flottants sont plus grands que quatre octets, Epic devra également modifier les parties de champ de bits de l'union pour y remédier, sinon ils ne mapperont pas le flotteur complet.