当前位置: 首页 > news >正文

在Unreal Engine中,UHT与反射机制

UHT(Unreal Header Tool) 是虚幻引擎(Unreal Engine)中的一个重要工具,它用于处理和生成引擎所需的元数据,使得虚幻引擎能够执行许多复杂的功能,如反射、序列化、蓝图交互、垃圾回收等。简而言之,UHT 是虚幻引擎中的“幕后工具”,负责从 C++ 头文件中提取信息,并生成用于引擎运行时的额外代码和元数据。

UHT的作用与工作原理

在虚幻引擎中,C++类、结构体和方法等通常会使用特定的宏标记(如 UCLASSUPROPERTYUFUNCTION)来提供额外的信息,这些信息用于引擎的各种系统。UHT 的任务就是读取这些头文件,识别宏,并生成相应的反射信息和元数据。

UHT 实际上是一个构建工具,它在编译阶段工作,处理头文件,分析 C++ 类和方法的声明,并根据标记生成一组“反射”数据。这些数据将在引擎运行时被使用,支持如蓝图、垃圾回收、序列化等功能。

虚幻引擎UHT与Visual Studio的编译配合是一个非常精细的过程,我将详细为你解析:

1.编译流程概述

  • UHT作为预编译工具优先运行
  • Visual Studio负责最终的代码编译
  • 两者协同完成项目构建

2.编译前UHT处理步骤

  • 扫描项目源代码
  • 识别特殊宏(UCLASS/UPROPERTY等)
  • 自动生成额外的中间代码文件
  • 生成.generated.h头文件

3.代码生成细节

  • 1)为每个标记的类生成反射信息
  • 每个 UCLASS() 标记的类都需要生成一个 UClass 对象,描述该类的元信息。这个 UClass 对象用于虚幻引擎的反射系统,它包含了类的基本信息,如类名、父类、方法和属性等。

    在 UHT 生成的代码中,UClass 对象是一个指向类描述的指针,它会通过静态构造函数来进行初始化。这些对象对于引擎动态加载和访问类、对象实例以及蓝图交互至关重要。

    例如,对于以下的类定义:

    UCLASS()
    class AMyActor : public AActor {UPROPERTY()float Health;
    };
    

    UHT 会生成一个静态方法来返回该类的 UClass 对象描述:

    static UClass* GetPrivateStaticClass() {static UClass* Class = nullptr;if (!Class) {// 构建类信息Class = GetPrivateStaticClassBody(StaticPackage(),TEXT("AMyActor"), AActor::StaticClass());}return Class;
    }
    

    这个静态方法返回了一个指向 AMyActor 类的 UClass 对象,该对象包含了类的元数据(如类名、继承关系、构造函数等)。

  • 2)创建静态注册函数
  • UHT 还会为每个 UCLASS 类生成该类的属性布局信息。这是一个数据结构,描述了类中每个属性的类型、偏移量、名称等信息。
  • 3)处理蓝图可调用函数
  • UHT 还会为每个 UCLASS 类生成一个包含属性和函数的元数据表,这些表用于存储属性、函数等的额外信息(例如是否可编辑、是否可蓝图调用等)。
  • 属性元数据表

    对于类中的每个属性(如 UPROPERTY 宏标记的属性),UHT 会生成一个元数据表,描述该属性的类型、名称以及它的其他特性。比如是否允许蓝图编辑、是否可以序列化等。

    函数元数据表

    类似于属性,UHT 还会为类中的每个方法(如 UFUNCTION 宏标记的方法)生成一个元数据表,描述该方法的可调用性、蓝图可见性等特性。

  • 4)静态注册函数生成
  • 每个 UCLASS 类除了反射信息之外,UHT 还会为类生成一个静态注册函数,用于将类注册到虚幻引擎的类型系统中。这个函数通常会在引擎初始化时被调用,以确保类的反射信息和其他元数据能够被引擎正确加载。

4.Visual Studio编译阶段

  • 加载UHT生成的中间文件
  • 编译完整的项目源代码
  • 链接反射和引擎相关代码

5.配合机制

TEXT

UHT预处理 → 生成中间文件 → VS编译 → 最终二进制

6.关键优化

  • 增量编译
  • 缓存生成的代码
  • 减少重复处理
  • 增量编译:只编译修改过的部分,避免全项目重编译,显著减少了编译时间。
  • 缓存生成的代码:缓存已经生成的中间代码(如反射信息、属性布局等),避免重复生成,提高编译速度。
  • 减少重复处理:通过依赖关系管理、内存缓存等技术,减少了重复的文件扫描、数据解析和不必要的处理步骤。

这就是UHT和Visual Studio协同工作的基本机制。

相关文章:

在Unreal Engine中,UHT与反射机制

UHT(Unreal Header Tool) 是虚幻引擎(Unreal Engine)中的一个重要工具,它用于处理和生成引擎所需的元数据,使得虚幻引擎能够执行许多复杂的功能,如反射、序列化、蓝图交互、垃圾回收等。简而言之…...

SQL项目实战与综合应用——项目设计与需求分析

项目设计与需求分析是软件开发过程中的核心环节,尤其在涉及数据库的应用时,良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践,结合 C 与 SQL 的实际应用场景,涵盖项目需求收集、数据库设…...

分布式中的CAP定理和BASE理论与强弱一致性

分布式中的CAP定理和BASE理论与强弱一致性 CAP定理 CAP定理,也称为布鲁尔定理(Brewer’s Theorem),是由加州大学伯克利分校的Eric Brewer教授在2000年提出的,并由麻省理工学院的Seth Gilbert和Nancy Lynch于2002年正…...

C/C++常见符号与运算符

C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支;在 switch-case 中如 case 1:表示标签结束点;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同;switch-case中也有:…...

了解 k8s 网络基础知识

了解 Docker 网络模式 在使用 Docker run 创建 Docker 容器时,可以使用 --net 选项指定容器的网络模式,Docker 可以有4种网络模式。 host 模式。–nethost 指定和宿主机共用一个 NetWork Namespace,容器中的网络环境(ip 地址、路…...

用户信息界面按钮禁用+发送消息功能

用户信息界面按钮禁用发送消息功能 前言 那么在上一集我们就完成了个人信息窗口所有的内容的修改,那么我们就需要进一步来看我们别的用户的信息界面的窗口。 需求分析 在之前的我们也讲了用户信息界面窗口一共有下图几种组件。 用户头像、用户id、用户昵称、用户…...

接近开关传感器-PCB线图电感式传感器【衰减系数1】

设计和工作原理 衰减系数为1的传感器是在电感式接近开关的基础上装备了特殊的振荡器。传感器内部有两个耦合空心线圈,能够保证根据不同的金属特性作合适的检测调整。无需考虑目标物是不同的金属,因为传感器能在同一感应距离下检测所有金属。 衰减系数为…...

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…...

计算机网络:传输层、应用层、网络安全、视频/音频/无线网络、下一代因特网

目录 (五)传输层 1.传输层寻址与端口 2.无连接服务与面向连接服务 3. 传输连接的建立与释放 4. UDP 的优点 5. UDP 和 TCP 报文段报头格式 6. TCP 的流量控制 7.TCP 的拥塞控制 8. TCP 传送连接的管理 &#…...

[漏洞挖掘与防护] 05.CVE-2018-12613:phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施

这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…...

GroundingDINO微调训练_训练日志解释

文章目录 1. 训练日志1. Epoch 和 Iteration2. Learning Rate(学习率)3. ETA(预计剩余时间)4. Time 和 Data Time5. Memory6. Gradient Norm(梯度范数)7. Loss(损失)8. Individual L…...

【0362】Postgres内核 XLogReaderState readBuf 有完整 XLOG page header 信息 ? ( 7 )

上一篇: 【0361】Postgres内核 page_read 读取所请求数据长度(至少 short page header)( 6 ) 文章目录 1. 检查 page_read 返回值 readLen2. 根据 readBuf 计算 XLogPageHeader 大小2.1 验证 XLOG Page header2.2 更新 XLogReaderState 读取状态信息1. 检查 page_read 返回…...

H5接入Steam 获取用户数据案例 使用 OpenID 登录绑定公司APP账户 steam公开用户信息获取 steam webapi文档使用

官方文档地址 1.注册 Steam API Key: 你需要一个 Steam Web API Key,可以在 Steam API Key 页面 获取。https://steamcommunity.com/dev/apikey 这里开发做demo用自己steam账户的就好,后续上线要用公司的账户 2.使用 OpenID 登录&#xff…...

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分,模型拆分(Model Parallelism)2.3 数据拆分,模型…...

力扣--LCR 178.训练计划VI

题目 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, 7, 5, 5] 输出&#…...

Linux 网络接口配置

在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如此对这些接口进行配置. 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络…...

【从零开始入门unity游戏开发之——C#篇01】理论开篇

文章目录 前言前置条件什么是编程?什么是代码?什么是编程语言?常见的编程语言什么是C#?学习Unity为什么要先学习C#?选择适合自己的IDE集成开发环境VSCode安装和环境配置VSCode调试模式专栏推荐完结 前言 这个系列我想…...

ABAP开发-批量导入BAPI和BDC_1

系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、概念二、BDC和BAPI数据导入1、BDC数据导入(录屏)2、BAPI数据导入 三、实例1、BAPI2、BDC 总结 前言 一、概念 SAP中,对一个事务码反复操作并且达到批量处理数据的效果&#xff0…...

RabbitMQ七种工作模式之 RPC通信模式, 发布确认模式

文章目录 六. RPC(RPC通信模式)客户端服务端 七. Publisher Confirms(发布确认模式)1. Publishing Messages Individually(单独确认)2. Publishing Messages in Batches(批量确认)3. Handling Publisher Confirms Asynchronously(异步确认) 六. RPC(RPC通信模式) 客⼾端发送消息…...

并非传统意义上的整体二分

是的,如标题所见,本文章会以作者所理解的整体二分思想来介绍一系列整体二分食用方法。 一下内容均是作者本人理解,可能会与算法本身冲突。 1 本质 1.1 板子及从中的启发 我们在做主席树板子的时候,如果使用整体二分&#xff0…...

PostgreSQL的一主一从集群搭建部署 (同步)

一、实验环境 虚拟机名IP身份简称keep-postgres12-node1192.168.122.87主节点node1keep-postgres12-node2192.168.122.89备节点node2 二、安装数据库 源码包方式(主) 1、创建用户 [rootkeep-postgres12-node1 ~]# groupadd postgres [rootkeep-post…...

ios逆向某新闻 md5+aes

本期的案例比较简单,也许是ios逆向算法本来就比较简单的原因,所以前面我就多扯一些爬虫和逆向的东西。之前写的文章都是js逆向和android逆向的案例,这也是首篇ios的案例,所以会从入门开始讲起。 3大逆向对比 首先爬虫工程师大部…...

grpc的负载均衡

grpc的负载均衡分为client-side load balance和server-side load balance。 所谓的“客户端负载均衡”是指主调方调用被调方的时候,在grpc.DialContext里需要指定grpc.WithDefaultServiceConfig,这个DefaultServiceConfig默认是用pick-first策略。也支持…...

提升搜索体验!—— 推出 Elastic Rerank 模型(技术预览版)

作者:来自 Elastic Shubha Anjur Tupil 几分钟内即可开始使用 Elastic Rerank 模型:强大的语义搜索功能,无需重新索引,提供灵活性和成本控制;高相关性、顶级性能和文本搜索效率。 使用我们全新的先进跨编码器 Elastic …...

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料:B站【普中官方】51单片机手把手教学视频 前置知识:C语言 单片机套装:普中STC51单片机开发板A4标准版套餐7 码字不易,求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验11&12.外部中断-定时器…...

webrtc-java:引领Java进入实时通信新时代

webrtc-java:引领Java进入实时通信新时代 项目地址:https://gitcode.com/gh_mirrors/we/webrtc-java 在现代互联网应用中,实时通信(Real-Time Communication, RTC)已成为连接人们的桥梁。而说起RTC技术的先锋,不得不…...

TongWeb7-东方通快速使用手册

TongWeb7-东方通 快速使用手册 文章目录 第1章 TongWeb7 产品介绍 1.1 概述1.2 规范支持 第2章 TongWeb7 安装 2.1 TongWeb7 安装要求 2.1.1 TongWeb7 支持的操作系统2.1.2 系统要求2.1.3 其他 2.2 安装TongWeb72.3TongWeb7 目录结构说明2.4 TongWeb7 的启动和停止 第3章 应用…...

JVM内存区块

大家好,经过前两篇文章的介绍,大家对数组也有了一定了解,其实所有的数组都是对象,我们在方法中引用数组的变量叫做引用变量(简称引用),那么数组到底是存放在哪里的呢,为什么引用再出…...

C语言单元总结

黑色加粗表示刷题刷到这样的题 红色加粗表示可能重要 单元一 程序设计宏观认识 C语言程序框架 C语言程序最基本的程序框架由两部分构成,分别是 1) 编译预处理 2) 函数组 C语言程序构成 C程序最大的特点就是所有的程序都是用函数来装配的,函数是构成…...

通过PS和Unity制作2D动画之一:创建形象

1、通过路径画出轮廓 使用路径的过程中,需要注意: 1)如果使用形状工具作图,比如使用椭圆工具画正圆形,需要设置其属性为“路径”。 2)使用路径选择工具,再按住Alt键点击某个路径,可…...

wordpress打开html/最新全国疫情消息

它取决于您定义为必需的:没有任何头字段必须与每个响应一起发送,无论什么情况,但有真正应该发送的头字段。唯一接近的头字段是Date,但即使它有它的情况下它不是必需的。在RFC 2119的说法中,术语MUST意味着某些是规范的…...

app定制哪里找/优化网站

上一篇从整个工程上简单分析了glog,请看C的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析。 1. 日志输出宏 这里我们以一条最简单的日至…...

修改wordpress的tag页/国内最新新闻事件

善于掌握自己时间的人,是真正伟大的人……可见,时间在我们日常生活或工作中是非常重要的……所以我们必须掌握一些Excel中关于时间日期的技巧。一、Excel日期时间:返回当前的日期。函数:Today()。功能:返回当前日期。语…...

外贸网站建设费用多少/semi是什么意思

PAYJS开通微信分账功能以来,有很多同学咨询相关情况。很多同学关心有没有什么办法,可以让自己的商户号快速开通企业付款功能。这里就介绍下微信分账的具体相关内容,可以完美解决问题。一、什么是微信分账? 微信分账的推出主要有三…...

成都网站建设优惠活动/网站友情链接交易平台

在浏览器支持的 CSS position: fixed (大多数的桌面浏览器, iOS5, Android 2.2, BlackBerry 6, 和其他)。工具栏使用“固定工具栏”插件将被固定在视图的顶部或底部,当页面自由滚动,固定栏始终浮动在屏幕的顶部或者底部。在浏览器不支持固定定位&#xf…...

网站平台建设所需开发工具/汕头网站推广

HBase的分页实现相对复杂一些。核心思想是结合分页过滤器PageFilter(pageSize)和查询设置开始行scan.setStartRow(lastRow),lastRow为上一次查询rowkey,需要注意的是该rowkey是一个数组,对应多字段的存储位置;不同用户登录会产生不同lastRow&…...