UE C++ 知识杂记

FString、FName与 FText

FName:(可以有效地存储名称和对资产或对象的引用

        它主要用于存储和引用名称,例如对象名称、属性名称和资产名称。引擎中的资源名称都是FName类型,通过一个轻型系统重复使用字符串,FName创建时会根据内容创建一个Hash值,且同样的内容只会存储一次。通过Hash值在进行FName的查找和访问时速度较快,而在比较的时,也不需要比较字符串内容,直接比较Hash值来区分不同FName字符串。

优点:

  • 高效的内存使用:FName 使用全局名称表,可减少多次存储相同名称时的内存开销。
  • 识别资产的理想选择:在引用纹理或材质等资产时,FName 可能比 FString 或 Text 更有效。

缺点:

  • 不区分大小写,不可更改不适合动态文本

FString :(进行动态文本操作和格式设置)

        是UE中使用的动态字符串类型。它类似于标准 C++ 字符串 (std::string),是处理文本的最灵活的选项,是三者中唯一可修改的字符串类型

优点:

  • 动态和可变:可以在创建 FString 后更改其内容。
  • 文本操作和格式化的理想选择:FString 非常适合在运行时连接、操作和格式化文本。

缺点:

  • FString对比其它两种字符串来说消耗更高,性能更低,避免在性能关键代码中过度使用

FText: (用于面向用户的文本、本地化以及以标准化方式维护可读的文本)

        着重在于显示与本地化,显示可理解玩家能直接看到的信息,本地化即多语言的处理,不可更改。相较于另外两种类型,FText会更加的臃肿,但提供了优秀的本地化功能。

优点:

  • 本地化支持:文本支持本地化,可以更轻松地管理游戏中的多种语言和翻译。
  • 不可变且安全:与 FName 一样,Text 是不可变的,可确保文本在运行时保持一致且不变。
  • 适用于面向用户的文本:使用文本显示用户界面、对话或玩家可见的任何文本。

缺点:

  • 内存开销略高:由于 FName 的本地化支持,Text 的内存开销略高,但它仍然比 FString 更省内存。

三者区别:

易变性:
  • FString:可变和动态。您可以在创建后更改其内容。
  • FName:不可变。一旦创建,就无法修改。
  • FText:不可变。文本对象在创建后也是不可更改的。
内存开销:
  • FString:由于其动态特性,内存开销略高。
  • FName:内存开销低,因为它使用全局名称表来减少冗余。
  • FText:与 FName 相比,内存开销略高,主要是由于本地化支持。
使用案例:
  • FString:非常适合动态文本操作、格式设置以及文本内容在运行时可能更改的任何情况。
  • FName:最适合存储和引用名称,尤其是对象、属性和资产。不适用于动态文本。
  • FText:专为面向用户的文本、本地化和维护人类可读的文本而设计。非常适合在用户界面、对话和游戏内容中显示的文本,其中本地化是一个问题。
性能:
  • FString:具有与动态内存分配和解除分配相关的性能成本。在性能关键代码中明智地使用它。
  • FName:由于其低内存开销和高效的名称查找,因此提供了出色的性能。
  • FText:在用户界面元素和本地化方面表现良好。虽然与 FName 相比,它有一些额外的开销,但对于大多数方案来说,它仍然是一个有效的选择。
本地化支持:
  • FString:没有内置的本地化支持。应手动管理文本以进行本地化。
  • FName:没有内置的本地化支持;通常用于内部引用,而不是面向用户的文本。
  • FText:在设计时考虑了本地化,使其成为管理不同语言文本的有力选择。

三者转换: 

转FName:

FString str = TEXT("String");
FText txt = LOCTEXT("keyName", "theValue");
FText txtNS = NSLOCTEXT("TextNameSpace", "keyName", "theValue");// FString 转 FName:不可靠,丢失大小写信息
FName name1 = FName(*str);FString strFromTxt = txt.ToString();
// FText 先转 FString,再转 FName:不可靠,丢失大小写信息,丢失本地化信息可能导致语言转换的潜在风险
FName name2 = FName(*strFromTxt);

转FString:

FName name = TEXT("Name");
FText txt = LOCTEXT("keyName", "theValue");
FText txtNS = NSLOCTEXT("TextNameSpace", "keyName", "theValue");// FName 转 FString:可靠
FString str1 = name.ToString();
// FText 转 FString:不可靠,丢失本地化信息可能导致语言转换的潜在风险
FString str2 = txt.ToString();

转FText:

FString str = TEXT("String");
FName name = TEXT("Name");// FString 转 FText:可靠
FText txt1 = FText::FromString(str);
// FName 转 FText:可靠
FText txt2 = FText::FromName(name);

注意事项:

需要注意的是,创建FText需要命名控件需要定义命名空间,并在编辑器开启本地化控制面板功能(Localization Dashboard):

I. 在当前源文件声明文本空间宏,在宏的声明范围内创建FText可以不需要命名空间参数,需要特别注意必须在源文件末尾取消声明

// Source.cpp 
// 声明文本空间宏
#define LOCTEXT_NAMESPACE "MyTextNameSpace"// 宏声明范围创建FText
FText txt = LOCTEXT("keyName", "theValue");// 必须要在合适的位置取消声明
#undef LOCTEXT_NAMESPACE 

II. 编辑器定义好命名空间,可在代码中直接使用:

// 利用已经定义好的命名空间
FText txtNS = NSLOCTEXT("TextNameSpace", "keyName", "theValue");

TArry(数组)

  • UE中的数组:最常用的数据容器,特点速度快,内存消耗小,安全性高。元素在内存中连续排列。
  • 同质容器:其所有元素均完全为相同类型。不能进行不同元素类型的混合。
  • 值类型:无法被继承不要使用new和delete在堆上进行创建销毁。元素也是数值类型,为容器拥有。TArray被销毁时元素也被销毁。从一个TArray创建新的TArray变量,将把元素复制到新的变量中,不存在共享状态。

TMap(映射)

  • UE中最常用的容器,此容器是关联型容器,存储对象均有一个关联值,通过键值可以高效的进行对象访问。
  • TMap也可以叫做键值对,键唯一不可重复,容器内元素在内存中非连续排列
  • TMap为同质容器,存储数据类型必须相同,TMap也是值类型,支持常规复制、赋值和析构函数操作,以及其元素较强的所有权。映射被销毁时,其元素也将被销毁。键类型必须为值类型,不能使用指针。
  • Map的结构例如钥匙和锁,一把钥匙找一把锁,他们之间是一一对应的关系 !(键值对)

 

TSet (集合)

  • TSet是一种快速容器类,用于在排序不重要的情况下存储唯一元素(元素在内存不连续).
  • TSet 类似于 TMap 和 TMultiMap,但有一个重要区别:TSet 把元素值做为键,而不是将数据值与独立的键相关联,无需提供单独的键进行关联元素。TSet 可以非常快速地添加、查找和删除元素。默认情况下,TSet 不支持重复的键.
  • TSet也是值类型,支持常规复制、赋值和析构函数操作,以及其元素较强的所有权。集合被销毁时,其元素也将被销毁。键类型也必须是值类型
  • TSet不保证数据填充顺序。
  •  TSet数据存储时无法重复存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3知识点补充第二节

01 自定义Hook 正常的组件&#xff1a;<template><div><img id"img" src"./assets/images/01.png" width"300" height"300"></img></div></template><script>// 导入hook组件 并传递一个…

【设计模式】六大设计原则

设计原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的六大设计原则零、单一职责原则开闭原则里氏代换原则依赖倒置原则接口隔离原则迪米特法则合成复用原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的 设计模式有23种&#xff0c;我认为对普通人来说想…

快速寻找可以构建出网通信隧道的计算机

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 为加强内网的安全防范&#xff0c;安全管理员往往会限制内网计算机访问互联网&#xff0c;当然不同机构的限制策略是不一样的&#xff0c;有的完全阻断了内网计算机访问…

如何发布自己的Python库?

Python包发布 1、背景概述2、操作指南 1、背景概述 为什么我们要发布自己的Python库&#xff1f;如果你想让你的Python代码&#xff0c;通过pip install xxx的方式供所有人下载&#xff0c;那就需要将代码上传到PyPi上&#xff0c;这样才能让所有人使用 那么&#xff0c;如何发…

Java基础知识总结(54)

&#xff08;1&#xff09; 手动实现LinkedList LinkedList底层结构实现和ArrayList底层数据结构实现有着本质上的区别 ArrayList底层实现主要依赖数组&#xff0c;而LinkedList底层实现则是依赖链表。 /** LinkedList的实现是双向链表&#xff0c;因此需要定义首节点和尾结点…

群晖双硬盘实时备份(WebDAV Server+Cloud Sync)

安装和设置 WebDAV Server WebDAV 是一种基于HTTP的协议扩展&#xff0c;它允许用户在远程Web服务器上进行文档的编辑和管理&#xff0c;就如同这些文件存储在本地计算机上一样。使用WebDAV&#xff0c;用户可以创建、移动、复制和修改文件和文件夹。 安装和设置 Cloud Sync…

2024/4/12 网络编程day2

OSI模型中的网络层次有哪些&#xff1f; 物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层TCP/IP协议族的分层有哪些&#xff1f; 网络接口层&#xff0c;网络层&#xff0c;运输层&#xff0c;应用层…

使用 Prometheus 在 KubeSphere 上监控 KubeEdge 边缘节点(Jetson) CPU、GPU 状态

作者&#xff1a;朱亚光&#xff0c;之江实验室工程师&#xff0c;云原生/开源爱好者。 KubeSphere 边缘节点的可观测性 在边缘计算场景下&#xff0c;KubeSphere 基于 KubeEdge 实现应用与工作负载在云端与边缘节点的统一分发与管理&#xff0c;解决在海量边、端设备上完成应…

前端面试问题汇总 - 浏览器篇

1. 本地存储有哪些&#xff0c;区别是什么&#xff1f; Cookies&#xff08;Cookie&#xff09;&#xff1a; 是存储在用户计算机上的小型文本文件&#xff0c;由网站服务器发送到用户的浏览器&#xff0c;然后在用户访问网站时由浏览器发送回服务器。Cookies 可以用来存储用户…

地球上四大洋介绍

地球上四大洋的分布是&#xff1a; 太平洋&#xff1a;太平洋是世界上最大的海洋&#xff0c;覆盖了约三分之一的地球表面。它位于亚洲、澳大利亚、美洲和南极洲之间。太平洋的面积约为1.6亿平方公里&#xff0c;拥有世界上最深的点——马里亚纳海沟。 大西洋&#xff1a;大西…

2024HW --> 安全产品 Powershell无文件落地攻击

在HW中&#xff0c;除了了解中间件&#xff0c;web漏洞&#xff0c;这些攻击的手法&#xff0c;还得了解应急响应&#xff0c;安全产品&#xff0c;入侵排查&#xff0c;溯源反制...... 那么今天&#xff0c;就来说一下安全产品&#xff08;安全公司我就不说了&#xff0c;这个…

ffmpeg cuda硬件解码后处理使用opengl渲染,全硬件流程

1 ffmpeg 硬件解码 使用硬件解码后不要transfer到内存&#xff0c;使用cuda转化nv12 -> bgr24 转化完毕后cuda里面存了一份bgr24 2 gpumat 和 cuda 互操作 如果需要opencv gpumat直接使用cuda内存&#xff0c;则可以手动构造gpumat 可以使用gpumat的各种函数 uchar3* cu…

6-139 大整数存储-数组

本题要求实现一个函数,实现大整数以整数形式存储。大整数按每4位保存在整数数组中,如果大整数位数不是4的倍数,则将保证低位都按4位一存。如“123456789”保存为1,2345,6789。大整数以字符串形式输入 int convert(char a[],int x[]); 函数接口定义: a 是以字符串形式输…

001vscode为什么设置不了中文?

VSCode中文插件安装 在VSCode中设置中文的首要步骤是安装“Chinese (Simplified) Language Pack for Visual Studio Code”扩展插件。这一过程十分简单&#xff0c;只需打开VSCode&#xff0c;进入扩展市场&#xff0c;搜索“ Chinese (Simplified) Language Pack ”然后点击…

【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中&#xff0c;通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中&#xff0c;蚁群算法的基本步骤如下&#xff1a; 1. 初始化: …

MES实施优势有哪些?MES制造执行系统的主要内容

各个行业之间也开始进入到了激烈的竞争当中&#xff0c;很多企业为了能够有效提升企业竞争力&#xff0c;都会通过提升自身实力的方式来提升竞争力。一些制造业也会在经营过程当中使用到MES系统&#xff0c;那么&#xff0c;mes系统的优势有哪些呢&#xff1f; 1、优化企业现场…

mysql dump导出导入数据

前言 mysqldump是MySQL数据库中一个非常有用的命令行工具&#xff0c;用于备份和还原数据库。它可以将整个数据库或者特定的表导出为一个SQL文件&#xff0c;以便在需要时进行恢复或迁移。 使用mysqldump可以执行以下操作&#xff1a; 备份数据库&#xff1a;可以使用mysqld…

ELK日志分析系统+Filebeat

目录 一、Filebeat介绍 1、Filebeat简介 2、Filebeat的工作方式 3、filebeat工作流程 4、Filebeat的作用 5、filebeat的用途 1.为什么要用filebeat来收集日志&#xff1f;为什么不直接用logstash收集日志&#xff1f; 2.filebeat和logstash的区别 二、部署(ELFK)Fileb…

自动化测试Junit

1.什么是Junit JUint是Java编程语言的单元测试框架&#xff0c;用于编写和运行可重复的自动化测试。 JUnit 促进了“先测试后编码”TDD的理念&#xff0c;强调建立测试数据的一段代码&#xff0c;可以先测试&#xff0c;然后再应用。这个方法就好比“测试一点&#xff0c;编码一…

现在有一个二叉树, 父节点保存子节点字符总长度。

现在有一个二叉树&#xff0c; 父节点保存子节点字符总长度。 typedef struct Node{ char *data; struct Node* left; struct Node* rigth; int length; }Node,*tree; 写一个求substring的功能。 Now, if we call substring with lower idx2 and upper idx7, the first part ca…