找回密码
 立即注册
查看: 513|回复: 0

Unreal PCG插件 浅析[1] UPCGData

[复制链接]
发表于 2024-7-15 18:49 | 显示全部楼层 |阅读模式
前言:

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

数据枚举

每个UPCGData都有属于本身的数据类型枚举EPCGDataType(PCGCommon.h)。
  1. UENUM(meta = (Bitflags))
  2. enum class EPCGDataType : uint32
  3. {
  4.         None = 0 UMETA(Hidden),
  5.         Point = 1 << 1,
  6.         Spline = 1 << 2,
  7.         LandscapeSpline = 1 << 3,
  8.         PolyLine = Spline | LandscapeSpline UMETA(Hidden),
  9.         Landscape = 1 << 4,
  10.         Texture = 1 << 5,
  11.         RenderTarget = 1 << 6,
  12.         BaseTexture = Texture | RenderTarget UMETA(Hidden),
  13.         Surface = Landscape | BaseTexture,
  14.         Volume = 1 << 7,
  15.         Primitive = 1 << 8,
  16.         /** Simple concrete data. */
  17.         Concrete = Point | PolyLine | Surface | Volume | Primitive,
  18.         /** Boolean operations like union, difference, intersection. */
  19.         Composite = 1 << 9 UMETA(Hidden),
  20.         /** Combinations of concrete data and/or boolean operations. */
  21.         Spatial = Composite | Concrete,
  22.         Param = 1 << 27,
  23.         Settings = 1 << 28 UMETA(Hidden),
  24.         Other = 1 << 29,
  25.         Any = (1 << 30) - 1
  26. };
复制代码
这里的枚举实现方式是一种很巧妙的方式,有效的操作了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。因为很简单,这是个静态成员变量。
  1. static inline std::atomic<uint64> UIDCounter{ 1 };
复制代码
如果从GetOrComputeCrc的名字上查看,似乎发现,这是获取当前Crc的法子,但是如果现有的Crc是无效的,那么,我们就要从头计算一个新的FPCGCrc,那么就到了ComputeCrc函数,首先生成FArchiveCrc32用来一会将UID序列化到当地。接下来AddToCrc函数,AddToCrc将数据增加到Crc,然后调用FArchiveCrc32完成序列化。

上一章:Unreal PCG插件 浅析 目录
下一章:Unreal PCG插件 浅析[2] UPCGSpatialData
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 17:51 , Processed in 0.098949 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表