UE4中的字符串类:FName、FText和FString

UE4中的字符串类:FName、FText和FString

前言

众所周知虚幻引擎的开发语言是C++,所以提到字符串类一般人首先会想到C++标准库里的字符串类:std::stringstd::string不可谓不强大功能不齐全,但UE4中并没有直接用它,而是自己实现了一套自己的字符串类,实际上是3个字符串类:FNameFTextFString。这究竟是为什么呢?
这看起来是多此一举的造轮子行为,但是其背后却是对引擎使用者的体贴。std::string是一个大而全的字符串类,但是并不满足在游戏的开发中某些特殊应用场景的需求,比如性能,多语言本地化等应用场景,于是才有了UE4中的这3个字符串类。

FName

顾名思义,FName这个字符串类是用来给某个东西命名(Name)的,也就是说作为一个东西的ID。这里说的东西可以是编辑器Content浏览窗口里看到的各种资源,可以是动态材质实例里的某个可设置的参数,还可以是模型骨架中某个具体的骨骼,以及比如角色mesh里用来attach武器的socket。在一个大型游戏里资源众多,能够快速定位到某个具体资源显得尤为重要,也就是说对性能有很高的要求。以判断两个字符串是否相同为例,std::string里的比较会直接比较字符串内容,时间复杂度值最坏情况是O(M*N)。要提高性能怎么办?最好像比较这些常见的操作时间复杂度是O(1)。FName就是为达到这个目的而设计的。当FName对象创建时,会根据字符串内容计算出一个hash值,并根据这个hash值把原始的字符串存到一张hash表里。FName对象里会记录自己所在的hash表的索引值,这样在实现比较逻辑时,它就不需要比较字符串内容,而是直接比较索引值是否相等。另外FName对象为不可变对象(immutable),即它被创建后就不能被修改了。它的这种只读属性使得它是天然的线程安全的。当然不可变对象还有其他的好处,具体可以参考下面的wiki链接:

Immutable object

需要注意的是FName是不区分大小写的。

FText

相比于FNameFText类显得有点重。虚幻引擎为游戏多语言支持提供了一个实验性的功能支持,其中就是围绕着FText这个类来实现的。在你的游戏中玩家所能见到的文本都应该用FText来做,比如在UI上的文本显示。总而言之,假如你希望利用这个实验性的功能来方便的实现多语言支持,那么就用FText

FString

FString是最接近标准库的std::string的字符串类,不同于FNameFText,它创建后是可修改的(mutable)。它提供大量操作字符串的方法,比如将字符串倒序,获取某个子串等。在你的程序内部,做比如拼装一个URL等逻辑时就会用到它。需要注意的是,因为它的可修改特性,它对性能不是那么的友好,另外在线程间共享时需要很注意。

总结

FNameFTextFString这3个字符串类实现的出发点不同,所以就要求引擎使用者要区分使用场景,对不同的场景使用相应的字符串类,这样才可以达到性能和功能上的完美兼顾。

你可能感兴趣的:(虚幻引擎入门,游戏开发)