在虚幻引擎中,C ++的float和FFloat32有什么区别?


17

我一直在尝试学习UE4的更深层次的内容,在阅读许多示例代码以及引擎的源代码时,我注意到有时人们(包括源代码)使用标准C ++ float原语,但有时使用UE4的自定义实现FFloat32

然后我很好奇:用Unreal编写游戏时,使用这两个选项有什么区别?可能应该放弃标准C ++原语以支持引擎实现的主要情况是什么?


1
我有兴趣阅读您发现的实际使用的示例FFloat32

@JoshPetrie其中一些离线,一对在线。一有时间,我就会搜寻他们分享的内容
Kim Shutter

Answers:


17

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 ++标准要求的两件事。它:

  • 允许您表现为一次同时有多个工会会员处于活动状态;您应该写入浮点成员并从整数成员之一(9.5.1,[class.union])中读取
  • 期望并集内的位域分配与IEEE浮点值的位分配相匹配;但是,实现类型定义了类类型中位域成员的分配和对齐方式(9.6.1,[class.bit])

虚幻不是用标准C ++编写的,它是针对为其编写的特定编译器编写的,因此只要它们执行与标准无关的预期工作即可。
user253751 '16

我希望这些位域即使在标准C / C ++中也可以移植,因为它们是由IEEE标准定义的,并且使用不同布局的任何编译器float都将不会获得IEEE 754兼容的红色标记(以及许多现有软件的兼容性问题) )。
德米特里·格里戈里耶夫

3
(学问的)问题是这些位字段的写入顺序可能与IEEE标准匹配,但是C ++编译器可能会对它们进行重新排序或重新对齐。不过,这只是一个小脚注,因为处理这是Epic的工作;他们应该监视每个新的编译器版本,以验证类型是否正确。

@JoshPetrie点了,谢谢您的澄清。
德米特里·格里戈里耶夫

1
@JustinLardinois但是FFloat32 float在联合中包含一个成员,因此如果float实际上大于32位,则总体情况FFloat32也将是这样,因为联合必须足够大才能容纳最大的成员。在浮点数大于四个字节的情况下,Epic将不得不修改联合的位域部分以解决该问题,否则它们将无法映射完整的浮点数。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.