UE4 架构浅析

UE4 根基—-UObject


UObject 存在的意义

  • 追本溯源:众所周知,C++的类可以没有父类,那么,对于各式各样的对象管理将变得繁琐而复杂,引入UObject之后,绝大多数类均由UObject派生而来,一个UObject对象指针即可遍历几乎所有对象。

  • GC:相信大多数C++程序员都曾因为内存管理而头疼。笔者也曾不止一次羡慕JAVA的自动GC。当然,随着C++发展,已经支持了智能指针等用法,但是,如果有一套成型的GC方案供你使用,由何乐而不为呢?虚幻关于GC原文描述如下:

      引擎创建了一个引用图表,以确定使用中和被弃用的对象。此图表的根部是指定为“根集”的一套对象。任何对象都可被添加到根集。垃圾回收发生时,引擎从根集开始在已知UObject的引用树中搜索,从而追踪所有被引用的对象。未被引用的对象将被视为没有存在价值,将被移除.

      此处表达了一个隐含意义-必须在要保留的对象上设置一个UPROPERTY引用。对Actor来说这经常会是例外,因为它们通常被链接回根集的对象所引用,例如它们所属于的等级。通过Destroy()可将Actor显式标记为待销毁。——UE4文档

  • 引用自动更新:被UPROPERTY标记的对象在垃圾回收的时候会自动更新为NULL,避免指针出现摇晃。

      对象被垃圾回收清理时,对它的 UPROPERTY 引用将自动被更新为 NULL。这可避免指针出现摇晃,造成之后的问题,但这也意味着指针有时可能出乎意料地变为 NULL 如果它们所指向的对象被显式标记为待销毁。因此,取消引用之前需要进行测试。

      请务必注意:此功能只适用于被UPROPERTY标记的对象引用。保存在裸指针中的对象引用无法被虚幻引擎识别,它不会自动清空,或阻止垃圾回收。注意:这并不意味着所有UObject* 变量必须为UProperties。如需要一个非 UProperty对象指针,可考虑使用TWeakObjectPtr<>。这是一个弱指针,因此它无法阻止垃圾回收,但它在被访问前可被执行有效性查询。——UE4文档

  • 序列化:简单说,序列化过程即是将内存中的对象数据转换为可以存储或传输的形式的过程。JAVA原生支持了,而纯C++需要手动实现序列化所需要的函数。不过,UObject实现了统一的序列化模型。当一个
    UObject 被序列化时,所有未被显示标记为“transient”的UProperty数值将被自动书写或读取。

  • 属性值更新:

      UClass 的CDO(ClassDefaultObject)发生变化时,引擎将尝试把这些变化智能应用到类的所有实例上(在它们被加载时)。对于一个特定的对象实例而言,如更新的变量与之前的默认之间不存在变化,其将被更新到新的默认对象。如变量已发生变化,则会假设数值被刻意进行设置,这些变化将不会被撤销。——UE4文档

  • 自动属性初始化:

      初始化时,在构建函数被调用之前,UObject将被自动清零。整类、UProperties和本地成员之类也会被执行此操作。成员可通过类构建函数中的自定义数值在随后进行初始化——UE4文档

(未完待续)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值