《InsideUE4》UObject(三)类型系统设定和结构

本文探讨了UE4游戏引擎中UObject的类型系统设定和结构,包括UObject的宏标记、生成代码的原因、类型系统的结构以及UField、UStruct、UEnum等的继承关系。通过理解这一系统,可以更好地掌握UE4的内部工作机制。
摘要由CSDN通过智能技术生成

垃圾分类,从我做起!

引言

上篇我们谈到了为何设计一个Object系统要从类型系统开始做起,并探讨了C#的实现,以及C++中各种方案的对比,最后得到的结论是UE采用UHT的方式搜集并生成反射所需代码。接下来我们就应该开始着手设计真正的类型系统结构。
在之后的叙述中,我会同时用两个视角来考察UE的这套Object系统:
一是以一个通用的游戏引擎开发者角度来从零开始设计,设想我们正在自己实现一套游戏引擎(或者别的需要Object系统的框架),在体悟UE的Object系统的同时,思考哪些是真正的核心部分,哪些是后续的锦上添花。踏出一条重建Object系统的路来。
二是以当前UE4的现状来考量。UE的Object系统从UE3时代就已经存在了(再远的UE3有知道的前辈还望告知),历经风雨,修修补补,又经过UE4的大改造,所以一些代码读起来很是诘屈聱牙,笔者也并不敢说通晓每一行代码写成那样的原由,只能尽量从UE的角度去思考这么写有什么用意和作用。同时我们也要记得UE是很博大精深没错,但并不代表每一行代码都完美。整体结构上很优雅完善,但也同样有很多小漏洞和缺陷,也并不是所有的实现都是最优的。所以也支持读者们在了解的基础上进行源码改造,符合自己本身的开发需求。

PS:类型系统不可避免的谈到UHT(Unreal Header Tool,一个分析源码标记并生成代码的工具),但本专题不会详细叙述UHT的具体工作流程和原理,只假定它万事如我心意,UHT的具体分析后续会有特定章节讨论。

设定

先假定我们已经接受了UE的设定:
在c++写的class(struct一样,只是默认public而已)的头上加宏标记,在其成员变量和成员函数也同样加上宏标记,大概就是类似C#Attribute的语法。在宏的参数可以按照我们自定的语法写上内容。在UE里我们就可以看到这些宏标记:

#define UPROPERTY(...)
#define UFUNCTION(...)
#define USTRUCT(...)
#define UMETA(...)
#define UPARAM(...)
#define UENUM(...)
#define UDELEGATE(...)
#define UCLASS(...) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_PROLOG)
#define UINTERFACE(...) UCLASS()

真正编译的时候,大体上都是一些空宏。UCLASS有些特殊,一般情况下最后也都是空宏,另外一些情况下会生成一些特定的事件参数声明等等。不过这暂时跟本文的重点无关。这里重点有两点,一是我们可以通过给类、枚举、属性、函数加上特定的宏来标记更多的元数据;二是在有必要的时候这些标记宏甚至也可以安插进生成的代码来合成编译。
我们也暂时不用管UHT到底应该怎么实现,就也先假定有那么一个工具会在每次编译前扫描我们的代码,获知那些标记宏的位置和内容,并紧接着分析下一行代码的声明含义,最后生成我们所需要的代码。
还有两个小问题是:

为何是生成代码而不是数据文件?
毕竟C++平台和C#平台不一样,同时在引用1里的UnrealPropertySystem(Reflection)里也提到了最重要的区分之处:

One of the major benefits of storing the reflection data as generated C++ code is that it is guaranteed to be in sync with the binary. You can never load stale or out of date reflection data since it’s compiled in with the rest of the engine code, and it computes member offsets/etc… at startup using C++ expressions, rather than trying

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值