我一直在尝试学习UE4的更深层次的内容,在阅读许多示例代码以及引擎的源代码时,我注意到有时人们(包括源代码)使用标准C ++ float
原语,但有时使用UE4的自定义实现FFloat32
。
然后我很好奇:用Unreal编写游戏时,使用这两个选项有什么区别?可能应该放弃标准C ++原语以支持引擎实现的主要情况是什么?
我一直在尝试学习UE4的更深层次的内容,在阅读许多示例代码以及引擎的源代码时,我注意到有时人们(包括源代码)使用标准C ++ float
原语,但有时使用UE4的自定义实现FFloat32
。
然后我很好奇:用Unreal编写游戏时,使用这两个选项有什么区别?可能应该放弃标准C ++原语以支持引擎实现的主要情况是什么?
Answers:
float
很好,是C ++浮点数。FFloat32
是一个结构,它表示一个浮点数以及(通过联合)该浮点数的符号,尾数和指数部分的分解位域。
通常你应该从来不使用FFloat32
时除外:
FFloat32
(非常罕见)的API 或并不是说它本身FFloat32
就不好,只是它并没有真正为您提供通用浮点使用所需的任何东西。
它比普通的旧版本少见,普通的旧版本float
对可读性有一些影响(其他人可能一眼就不知道它的用途)。它也不会隐式转换为,float
因此您将输入something.FloatValue
很多内容,这也不是什么大问题,但可能会很乏味。
最后,它对联合和位域的使用是不可移植的,并且是实现定义的(请参见下文)。这不是您的问题,Epic的工作是确保类型的结构使其可用于所有受支持的实现,但是如果新编译器无法捕获类型实现的问题,则可能是潜在的错误来源版本已发布或添加到受支持的编译器列表中。
因此,除非您需要使用浮点表示中的各个位,否则您应该避免使用FFloat32
它的表亲(的表亲,FFloat16
由于没有标准的16位C ++浮点类型,因此实用性可能会稍微提高一些)。
过去常常通过其组件的整数表示形式来对float进行操作,以表示“ speed”。现代计算机避免太多的需要为许多平台和各种类型双关语,可以用来做这种事的技术实际上是有害的在任何情况下的性能和正确性。
应该说,对Unreal的GitHub存储库的搜索显示很少使用该FFloat32
类型。所有这些都在其FFloat32
本身的定义中 或在的定义中FFloat16
。
具体来说,FFloat32
执行C ++标准要求的两件事。它:
float
都将不会获得IEEE 754兼容的红色标记(以及许多现有软件的兼容性问题) )。
FFloat32
。