UE学习笔记--如何区分FString、FName、FText,以及使用场景

目录

    • 前言
    • FString
    • FName
    • FText
    • FString、FName 和 Text 之间的区别
        • 可变性
        • 内存开销
        • 用例
        • 表现
        • 本地化支持
    • 结论
    • 参考链接

前言

最近在学习 UE,发现 UE 基本没有用到 std::string,基本使用的是FString、FName、FText。去网络上查了些资料并且学习了下,在这里做个简单介绍和总结。为什么需要三种字符串呢?主要是因为他们三都有自己擅长的场景。

FString

FString 是 的缩写Fixed String,是虚幻引擎中使用的动态字符串类型。它类似于标准 C++ 字符串 (std::string),是处理文本的最灵活的选项。以下是 FString 用法的一些主要功能和示例

  1. 动态和可变:可以在创建 FString 后更改其内容。
FString MyString = "Hello, ";
MyString += "Unreal Engine!";
  1. 文本操作和格式化的理想选择:FString 非常适合在运行时连接、操作和格式化文本。
FString PlayerName = "John";
FString Greeting = FString::Printf(TEXT("Hello, %s!"), *PlayerName);
  1. 性能考虑因素:由于 FString 的动态特性,与 FName 和 Text 相比,FString 的性能开销较小。避免在性能关键型代码中过度使用。

FName

  1. FName 是 的缩写Fixed Name,是虚幻引擎中更专业的数据类型。它主要用于存储和引用名称,例如对象名称、属性名称和资产名称。FName不区分大小写,为便于快速定位某个资源。FName当创建时,会根据字符串内容计算出一个Hash值,这样实现比较逻辑的时候不用比较字符串内容,而是直接比较hash值是否相等,就是O(1).

注意:FName 不区分大小写

  1. 高效的内存使用:FName使用全局名称表,可以减少多次存储相同名称时的内存开销。
    在此示例中,Firstname 和 SecondName 都引用全局名称表中的相同条目,从而节省内存。
FName Firstname = FName(TEXT("John"));
FName SecondName = FName(TEXT("John"));
  1. 不适合动态文本:FName 是不可变的,不适合动态文本操作。为此,请使用 FString 或 Text。

FText

  1. 文本是虚幻引擎中另一种与文本相关的数据类型,对于本地化和以人类可读的格式维护文本特别有用。以下是文本的一些关键特征和用例:
    本地化支持:文本支持本地化,可以更轻松地管理游戏中的多种语言和翻译。
FText MyLocalizedText = NSLOCTEXT("MyNamespace", "MyKey", "Hello World!");
  1. 不可变且安全:与 FName 一样,Text 是不可变的,这确保文本在运行时保持一致且不变。
  2. 适用于面向用户的文本:使用文本来显示用户界面、对话或玩家可见的任何文本。
UTextBlock* TextElement = ...;
TextElement->SetText(MyLocalizedText);
  1. 内存开销稍多:由于其本地化支持,Text 的内存开销比 FName 稍高,但它仍然比 FString 更节省内存。

FString、FName 和 Text 之间的区别

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

结论

了解虚幻引擎中 FString、FName 和 Text 之间的差异对于高效的游戏开发至关重要。每种数据类型都有其独特的优点和缺点,使其适合特定的用例。总结一下:

使用 FString 进行动态文本操作和格式化。使用 FName 有效存储名称以及对资产或对象的引用。使用文本以标准化方式进行面向用户的文本、本地化和维护人类可读的文本。通过为作业选择正确的数据类型,您可以优化内存使用并提高虚幻引擎项目的整体性能和可维护性。

参考链接

虚幻中的 FSTRING、FNAME 与 TEXT

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

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

相关文章

Numpy中的矩阵运算

一、Matrix和Array Matrix名为矩阵,Array名为阵列,它们都可以作为矩阵运算的结构,功能上Matrix是Array的子集,Matrix运算符相较于Array简单。本文章主要讲解Numpy中的Matrix和Array关于矩阵运算的区别,代码部分已经给出…

Mysql数据库:快速入门

目录 一. 介绍 1. 数据库基础概念 2 MySQL简介 二. 安装与配置 1. 下载与安装 MySQL 2. 配置 MySQL 三. 基本操作 1. 数据库的创建与删除 3 数据操作语言(DML) 4 数据查询语言(DQL) 5 数据控制语言(DCL&…

年终总结:我的2023编程之旅

1. 成果回顾 在这一年中,我成功地完成了多个项目,其中最重要的是我们团队开发的“智能数据分析平台”。我负责了后端开发的核心部分,该平台目前每天处理超过100万条数据,为我们的客户提供了宝贵的信息和建议。同时,我…

2024.1.19 网络编程 作业

思维导图 练习题 1> UDP传输实现聊天室 服务器端 #include <myhead.h> #define SER_IP "192.168.125.151" #define SER_PORT 9999 typedef struct Msg {char user[32]; //用户名int type; //执行操作1.登录、2.发消息、0.退出char text[1024]; …

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…

在 Python 中检查一个数字是否是同构数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 同构数&#xff0c;又称为自守数或自同构数&#xff0c;是一类特殊的数字&#xff0c;它们具有一种有趣的性质&#xff1a;将其平方后的数字&#xff0c;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

Java读取制表符文本转换为JSON

在Java开发中&#xff0c;处理各种数据格式是常见的任务。本文将介绍如何使用Java读取制表符文本文件&#xff0c;并将其转换为JSON格式&#xff0c;以便于后续的数据处理和分析。我们将使用Java中的相关库来实现这个过程&#xff0c;并提供详细的代码示例。 引言&#xff1a;…

4654. 消除游戏

4654. 消除游戏 - AcWing题库 #include <iostream> #include <vector> #include <cstring> using namespace std;const int N 1e6 10; char s[N]; int l[N], r[N]; vector<int> v, p; bool st[N]; void ins(int i) {if (st[i]) return;st[i] true;…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

Dockerfile镜像构建

Dockerfile镜像构建 1、部署harbor仓库 #部署docker #解压harbor安装包 rootharbor:~# cd /app/harbor/ rootharbor:/app/harbor# ll total 597560 drwxr-xr-x 3 root root 180 Jan 13 13:17 ./ drwxr-xr-x 4 root root 77 Jan 13 13:14 ../ drwxr-xr-x 3 root …

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉导航

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 VX关注&#xff0c;并留下邮箱可获得每日定时推送 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化…

网络爬虫原理介绍

网络爬虫是一种按照一定规则自动浏览、检索网页信息的程序或者脚本。它能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 Python 爬虫是指用 Python 语言编写的网络爬虫程序。Python 爬虫几乎成了网络爬…

Mysql三种常用的删除方式

前言 在 MySQL 中&#xff0c;有三种常用的方式可以删除表中的数据或整个表&#xff0c;它们分别是 TRUNCATE、DROP 和 DELETE。 TRUNCATE TABLE TRUNCATE TABLE属于DDL语言&#xff0c;不走事务&#xff0c;数据不会回滚 TRUNCATE TABLE 语句会删除表中的所有数据&#xff…

深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

Framework层之输入系统 第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 文章目录 Framework层之输入系统前言一、基础知识1、输入子系统2、INotify 与 Epoll2.1、INotify 机制…

SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换

场景 SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源&#xff1a; SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源-CSDN博客 上面实现通过注解和配置文件的方式去进行多数据源操作。 如果业务需求&#xff0c;比…

Python 循环结构的一些案例练习

题目1&#xff1a;找出100-999之间的水仙花数&#xff08;各位数字的立方和刚好等于这个数本身&#xff09; 如&#xff1a;153 1^3 5^3 3^3算法分析&#xff1a; 123 // 100 1 ---> 23 获取百位数 123 // 10 12 % 10 2 --> 获取十位数&#xff08;法一&#x…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

大模型日报-20240120

这里写目录标题 视觉Mamba来了&#xff1a;速度提升2.8倍&#xff0c;内存能省87%一键实景转动画&#xff0c;清华系初创公司全球首发4D骨骼动画框架&#xff0c;还能生成个性化角色如何利用革命性的蛋白质结构工具来发现药物&#xff1f;AlphaFold 发现了数千种可能的致幻剂扎…