He estado tratando de aprender algunos aspectos más profundos de UE4 y mientras leía muchos códigos de ejemplos y también la base del motor, noté que a veces las personas (y el código fuente) usan la float
primitiva C ++ estándar , pero a veces usan la implementación personalizada de UE4 FFloat32
.
Luego tuve curiosidad: cuando programo un juego con Unreal, ¿cuáles son las diferencias entre el uso de esas 2 opciones y, posiblemente, cuáles son los principales casos en los que uno debería abandonar la primitiva C ++ estándar a favor de la implementación del motor?
c++
unreal-4
floating-point
Kim Shutter
fuente
fuente
FFloat32
.Respuestas:
float
, está bien, un punto flotante C ++.FFloat32
es una estructura que representa un flotador, así como (a través de una unión) los campos de bits descompuestos para las partes de signo, mantisa y exponente de ese flotador.Por lo general, nunca debe usar,
FFloat32
excepto cuando:FFloat32
(estos son muy raros) oNo es que
FFloat32
sea malo , per se, es que realmente no le ofrece nada que necesite para el uso de punto flotante de uso general.Es menos común que un viejo simple
float
, que tiene un impacto de legibilidad menor (otros pueden no saber de inmediato para qué sirve de un vistazo). Tampoco se convierte implícitamente, porfloat
lo que escribirássomething.FloatValue
mucho, lo que tampoco es un gran problema, pero podría ser tedioso.Finalmente, su uso de uniones y campos de bits no es portátil y está definido por la implementación (ver más abajo). Este no es su problema, es el trabajo de Epic asegurarse de que el tipo esté estructurado de modo que sea utilizable para todas las implementaciones compatibles, pero es una fuente potencial de errores si no detectan un problema con la implementación del tipo cuando un nuevo compilador La versión se publica o se agrega a la lista de compiladores compatibles.
Entonces, a menos que tenga la necesidad de jugar con los bits individuales en la representación de coma flotante, probablemente debería evitarlo
FFloat32
(su primoFFloat16
puede tener un poco más de utilidad ya que no hay un tipo de coma flotante C ++ estándar de 16 bits).Solía ser común manipular flotadores a través de representaciones enteras de sus componentes para " velocidad ". Las computadoras modernas eliminan gran parte de esa necesidad de muchas plataformas, y las diversas técnicas de tipografía que podrían usarse para hacer este tipo de cosas pueden ser realmente perjudiciales para el rendimiento o la corrección en cualquier caso.
Debería ser revelador que una búsqueda en el repositorio GitHub de Unreal revela muy pocos usos del
FFloat32
tipo. Todos ellos están en la definición deFFloat32
sí mismos o en la definición deFFloat16
.Específicamente,
FFloat32
hace dos cosas que llama el estándar C ++. Eso:fuente
float
obtendría una marca roja compatible con IEEE 754 (y problemas de compatibilidad con muchos programas existentes) )float
miembro en el sindicato, por lo que si enfloat
realidad es mayor que 32 bits, el total tambiénFFloat32
lo será, ya que el sindicato debe ser lo suficientemente grande como para contener al miembro más grande. En los casos en que los flotantes sean mayores de cuatro bytes, Epic tendrá que modificar también las partes de campo de bits de la unión para abordar eso, de lo contrario no asignarán el flotante completo.