Я пытался изучить некоторые более глубокие аспекты UE4 и, читая множество примеров кодов, а также исходную базу движка, я заметил, что иногда люди (и сам исходный код) используют стандартный float
примитив C ++ , но иногда используют пользовательскую реализацию UE4 FFloat32
,
Тогда мне стало любопытно: при программировании игры на Unreal, в чем различия между этими двумя вариантами и, возможно, в каких основных случаях нужно отбросить стандартный примитив C ++ в пользу реализации движка?
c++
unreal-4
floating-point
Ким Шуттер
источник
источник
FFloat32
.Ответы:
float
Хорошо, C ++ с плавающей точкой.FFloat32
является структурой, которая представляет число с плавающей точкой, а также (через объединение) разложенные битовые поля для частей знака, мантиссы и экспоненты этого числа с плавающей точкой.Как правило, вы никогда не должны использовать,
FFloat32
за исключением случаев, когда:FFloat32
(это очень редко) илиЭто не значит, что
FFloat32
это плохо , по сути, это просто , что это на самом деле не предложить вам все , что вы бы необходимо для общего назначения с плавающей точкой использования.Он встречается реже, чем обычный старый
float
, что оказывает незначительное влияние на читаемость (другие могут сразу не узнать, для чего он нужен). Кроме того, он не конвертируется в неявно,float
поэтому вы будетеsomething.FloatValue
много печатать , что тоже не так уж сложно, но может стать утомительным.Наконец, его использование объединений и битовых полей непереносимо и определяется реализацией (см. Ниже). Это не ваша проблема, задачей Epic является обеспечение того, чтобы тип был структурирован так, чтобы его можно было использовать для всех поддерживаемых реализаций, но это потенциальный источник ошибок, если они не могут обнаружить проблему с реализацией типа, когда новый компилятор версия выпущена или добавлена в список поддерживаемых компиляторов.
Поэтому, если вам не нужно играть с отдельными битами в представлении с плавающей запятой, вам, вероятно, следует просто избегать
FFloat32
(его двоюродный братFFloat16
, возможно, будет иметь немного больше полезности, поскольку не существует стандартного 16-битного типа C ++ с плавающей запятой).Раньше было обычным манипулировать числами с плавающей точкой через целочисленные представления их компонентов для « скорости ». Современные компьютеры устраняют большую часть этой потребности для многих платформ, и различные методы штамповки типов , которые могут быть использованы для такого рода вещей, на самом деле могут нанести ущерб производительности или корректности в любом случае.
Следует отметить, что поиск в репозитории Unreal GitHub обнаруживает очень мало случаев использования этого
FFloat32
типа. Все они находятся в определении самогоFFloat32
себя или в определенииFFloat16
.В частности,
FFloat32
делает две вещи, которые стандарт C ++ вызывает. Это:источник
float
, получит не соответствующую стандарту IEEE 754 (и проблемы совместимости со многими существующими программами) ).float
член в объединении, так что еслиfloat
он на самом деле больше 32 бит, то общий размерFFloat32
будет таким же, поскольку объединение должно быть достаточно большим, чтобы вместить самого большого члена. В случаях, когда значения с плавающей запятой превышают четыре байта, Epic придется также модифицировать части битового поля объединения, чтобы решить эту проблему, иначе они не будут отображать полное значение с плавающей запятой.