netiis 发表于 2024-7-15 18:49

Unreal PCG插件 浅析[1] UPCGData

前言:

在PCGData.h里面基本就是数据的父类,在代码里面我们可以看到UPCGData担任于UObject,那么来自于UObject的提供的一些功能和特性自然而然在UPCGData,比如反射生成、垃圾回收GC等。
UPCGData是作为一个模糊的基类存在的,感化是保留必要的模糊性来传递各种具体的数据类型、设置等等。
详细介绍:

数据枚举

每个UPCGData都有属于本身的数据类型枚举EPCGDataType(PCGCommon.h)。
UENUM(meta = (Bitflags))
enum class EPCGDataType : uint32
{
        None = 0 UMETA(Hidden),
        Point = 1 << 1,

        Spline = 1 << 2,
        LandscapeSpline = 1 << 3,
        PolyLine = Spline | LandscapeSpline UMETA(Hidden),

        Landscape = 1 << 4,
        Texture = 1 << 5,
        RenderTarget = 1 << 6,
        BaseTexture = Texture | RenderTarget UMETA(Hidden),
        Surface = Landscape | BaseTexture,

        Volume = 1 << 7,
        Primitive = 1 << 8,

        /** Simple concrete data. */
        Concrete = Point | PolyLine | Surface | Volume | Primitive,

        /** Boolean operations like union, difference, intersection. */
        Composite = 1 << 9 UMETA(Hidden),

        /** Combinations of concrete data and/or boolean operations. */
        Spatial = Composite | Concrete,

        Param = 1 << 27,
        Settings = 1 << 28 UMETA(Hidden),
        Other = 1 << 29,
        Any = (1 << 30) - 1
};这里的枚举实现方式是一种很巧妙的方式,有效的操作了uint32的每一位,在这个枚举里面我们可以看到,很多的类型,不仅有斗劲基础的类型(用二进制的某一位为1暗示),而且还有多个枚举组合起来的枚举(比如PolyLine 就是靠4|8 = 12这种类似于巧妙的加法实现的)。
作为一个基类,那么我们的UPCGData就是EPCGDataType::None类型。
Crc

FPCGCrc(PCGCrc.h)在UPCGData一个重要的布局体,这个翻译较为拗口,Crc是循环冗余校验,我们在后文,统一用UE的FPCGCrc称号。
FPCGCrc是一个较为简单的布局体,它里面只记录了两个值,一个Value和一个bValid,用来记录一个Crc的同时,也记录这个Crc是否有效。
FPCGCrc可以结合两个Crc值,比如结合了第三方的Value值之后,本身也会变成这个新的值。
这个Crc值可以是另一个FPCGCrc,也可以是具体的uint32,两者的方式都有。
判断两个FPCGCrc是否相等,首先看两者是否拥有同样的bValid,同时拥有同样的Value。
UPCGData拥有FPCGCrc,必定要在后面阐扬不小的感化。
UPCGData有好几个函数用来生成或者维护FPCGCrc数据,比如获取,生成等。
UIDCounter和UID

UID是一个uint64的数据,用来暗示GUID。
UIDCounter定义如下,UIDCounter是一个原子数据类型(原子数据类型是避免反复的UIDCounter从而避免反复的UID),而且在构建UPCGData的加1,然后将UIDCounter的赋值给UID,但是在这里是如何保证每个生成的UPCGData都在前者的基础上加1,而不是在一个固定的基础上加1。因为很简单,这是个静态成员变量。
static inline std::atomic<uint64> UIDCounter{ 1 };如果从GetOrComputeCrc的名字上查看,似乎发现,这是获取当前Crc的法子,但是如果现有的Crc是无效的,那么,我们就要从头计算一个新的FPCGCrc,那么就到了ComputeCrc函数,首先生成FArchiveCrc32用来一会将UID序列化到当地。接下来AddToCrc函数,AddToCrc将数据增加到Crc,然后调用FArchiveCrc32完成序列化。

上一章:Unreal PCG插件 浅析 目录
下一章:Unreal PCG插件 浅析 UPCGSpatialData
页: [1]
查看完整版本: Unreal PCG插件 浅析[1] UPCGData