Eu tenho tentado aprender alguns aspectos mais profundos do UE4 e ao ler muitos exemplos de códigos e também a base de código-fonte do mecanismo, notei que algumas vezes as pessoas (e o próprio código-fonte) usam a float
primitiva C ++ padrão , mas algumas vezes usam a implementação personalizada da UE4 FFloat32
.
Então fiquei curioso: ao programar um jogo com a Unreal, quais são as diferenças entre usar essas duas opções e, possivelmente, quais são os principais casos em que se deve abandonar a primitiva C ++ padrão em favor da implementação do mecanismo?
c++
unreal-4
floating-point
Kim Shutter
fonte
fonte
FFloat32
.Respostas:
float
, é um ponto flutuante em C ++.FFloat32
é uma estrutura que representa um flutuador e (através de uma união) os campos de bits decompostos para as partes do sinal, mantissa e expoente desse flutuador.Você geralmente nunca deve usar,
FFloat32
exceto quando:FFloat32
(estes são muito raros) ouNão
FFloat32
é ruim , por si só, apenas não oferece realmente nada que você precisa para o uso de ponto flutuante de uso geral.É menos comum do que um simples velho
float
, que tem algum impacto menor na legibilidade (outras pessoas podem não saber imediatamente para que serve imediatamente). Também não é convertido implicitamente em,float
portanto você digitarásomething.FloatValue
muito, o que também não é grande coisa, mas pode ser entediante.Por fim, o uso de uniões e campos de bits não é portátil e é definido pela implementação (veja abaixo). Esse não é o seu problema, é tarefa da Epic garantir que o tipo seja estruturado para que seja utilizável em todas as implementações suportadas, mas é uma fonte potencial de erros se eles não conseguirem detectar um problema com a implementação do tipo quando um novo compilador A versão é lançada ou adicionada à lista de compiladores suportados.
Portanto, a menos que você precise brincar com os bits individuais na representação de ponto flutuante, provavelmente deve evitar
FFloat32
(seu primoFFloat16
, pode ter um pouco mais de utilidade, pois não há um tipo de ponto flutuante C ++ de 16 bits padrão).Costumava ser comum manipular carros alegóricos por meio de representações inteiras de seus componentes para " velocidade ". Os computadores modernos evitam grande parte dessa necessidade de muitas plataformas, e as várias técnicas de punção de tipo que podem ser usadas para fazer esse tipo de coisa podem, na verdade, ser prejudiciais ao desempenho ou à correção em qualquer caso.
Deve-se dizer que uma pesquisa no repositório GitHub da Unreal revela muito poucos usos do
FFloat32
tipo. Todos eles estão na definição deFFloat32
si ou na definição deFFloat16
.Especificamente,
FFloat32
faz duas coisas que o padrão C ++ chama. Isto:fonte
float
teria uma marca vermelha compatível com IEEE 754 (e problemas de compatibilidade com muitos softwares existentes )float
membro do sindicato, portanto, se elefloat
for realmente maior que 32 bits, o totalFFloat32
também será bom, já que o sindicato deve ser grande o suficiente para conter o maior membro. Nos casos em que os flutuadores são maiores que quatro bytes, a Epic terá que modificar também as partes do campo de bits da união para resolver isso; caso contrário, eles não mapearão o flutuador completo.