UE_C++ —— UE反射系统(三)
目录一UObject Instance CreationObject Flags二Unreal Object Handling一UObject Instance Creation创建对象新实例的方法// NewObject() 是最简单的UObject工厂方法接受一个可选的外部对象和类并用自动生成的名称创建一个新实例 template class T T* NewObject ( UObject* Outer (UObject*)GetTransientPackage(), // 可选的对象外部 UObject UClass* Class T::StaticClass() // 可选的对象类的 UClass )// NewNamedObject() 是在 NewObject() 上扩展通过为新实例指定名称、对象标记、模板对象 template class TClass TClass* NewNamedObject ( UObject* Outer, FName Name, EObjectFlags Flags RF_NoFlags, UObject const* Template NULL // 创建新对象时用作模板的 UObject )// 此函数调用 StaticConstructObject() 来分配内存执行 ClassConstructor 并初始化如加载配置属性加载本地化属性和实例化组件 template class T T* ConstructObject ( UClass* Class, UObject* Outer (UObject*)GetTransientPackage(), FName Name NAME_None, EObjectFlags SetFlags RF_NoFlags, UObject const* Template NULL, bool bCopyTransientsFromClassDefaults false, struct FObjectInstancingGraph* InstanceGraph NULL )Object FlagsEObjectFlags枚举用于快速而简洁地描述对象有多种描述对象的标志、垃圾收集如何处理、对象在其生命周期中所处的阶段等等还有特殊的全掩码或无掩码和预定义的标记组Object TypeFlagValueDescriptionRF_Public0x00000001对象在包含它的包外部是可见的RF_Standalone0x00000002即使没有被任何东西引用对象也会被保留以供编辑RF_Native0x00000004对象是本地对象仅用于UClass对象RF_Transactional0x00000008对象是事务对象RF_ClassDefaultObject0x00000010对象是其类的默认对象即该类的新实例在创建时使用的默认模板RF_ArchetypeObject0x00000020对象是另一个对象的模板。它被视为一个类默认对象RF_Transient0x00000040对象不保存到磁盘Garbage CollectionFlagValueDescriptionRF_RootSet0x00000080即使对象没有被任何东西引用也不被垃圾回收RF_IsLazyReferenced0x00000100对象由一个延迟指针引用删除时需要额外的清理RF_Unreachable0x00000400对象图表上不能访问该对象RF_TagGarbageTemp0x00000400对象被标记为供使用垃圾回收的各种实用程序所使用此标记不由垃圾回收器本身解释Object LifetimeFlagValueDescriptionRF_NeedLoad0x00000800对象需要加载RF_AsyncLoading0x00001000对象是异步加载的RF_NeedPostLoad0x00002000对象需要后加载RF_NeedPostLoadSubobjects0x00004000对象仍然需要实例化子对象并修复序列化的组件引用RF_PendingKill0x00008000对象正在等待销毁基于游戏目的将对象标记为无效但仍然是有效的对象RF_BeginDestroyed0x00010000对象已经调用了BeginDestroy()RF_FinishDestroyed0x00020000对象已经调用了FinishDestroy()Special MasksFlagValueDescriptionRF_AllFlags0x0003ffff对象具有所有标记主要用于错误检查RF_NoFlags0x00000000对象不具有标记用于避免类型转换Predefined GroupsFlagValueDescriptionRF_LoadRF_Public | RF_Standalone | RF_Native | RF_Transactional | RF_ClassDefaultObject | RF_ArchetypeObject从虚幻文件加载的标记RF_PropagateToSubobjectsRF_Public | RF_ArchetypeObject | RF_Transactional子对象从其超对象继承的标记二Unreal Object Handling使用适当的宏标记类、属性和函数可以将其转变为UClasses、UProperties和UFunctions以让引擎能够访问它们从而实现一些后台处理功能Automatic Property Initialization在调用构造函数之前UObject在初始化时自动归零会作用于整个类如UProperties和原生成员成员随后可在类构造函数中使用自定义值进行初始化Automatic Updating of References当AActor或UActorComponent被销毁或从运行中删除时对反射系统可见的对它的所有引用UProperty指针和引擎容器类中存储的指针如TArray都将自动清空以防止悬空指针持久存在并导致后续问题如果其他某段代码将AActor和UActorComponent指针销毁时这些指针也会变为空这种功能仅适用于标记了UPROPERTY或存储在引擎容器类中的UActorComponent或AActor引用存储在原始指针中的Object引用对于引擎未知不会自动清空也不会妨碍垃圾回收注意这不意味着所有UObject*变量都必须是UProperties如需要的Object指针不是UProperty考虑使用TWeakObjectPtr不妨碍垃圾回收但可查询有效性再访问且所指向的Object被销毁时将被置空另一种被引用UObject UProperty自动清空的情况是对编辑器中的资源使用强制删除Force Delete因此作用于属于资源的UObject的所有代码都必须处理这些指针变为空的情况Serialization当UObject被序列化时所有UProperty值都将被自动写入或读取除非显式标记为transient或无法从post-constructor默认值更改如可在关卡中放入AEnemy实例将其Health设置为500保存并成功地重新加载而不必在UClass定义之外编写一行代码当添加或移除UProperties时系统会无缝处理预先加载存在的内容新属性从新的CDO复制默认值移除的属性将会被静默忽略如需自定义行为可以重写UObject::Serialize函数这对于检测数据错误检查版本号或执行自动转换或更新如数据格式有所更改十分有用Updating of Property Values当UClass的类默认对象CDO更改引擎将尝试在加载类的所有实例时对这些实例应用这些更改对于给定Object实例如更新的变量值与旧CDO中的值相匹配则将更新为它在新CDO中保存的值如假设在一个关卡中放置了多个AEnemyObject 并保存然后将AEnemy构造函数中的默认Health值设置为100再假设将Enemy_3的Health值设置为500现在假设改变主意将Health的默认值增加到150下次加载关卡时使用旧默认Health值100的所有AEnemy实例将更新为150Enemy_3的Health将保持在500因为它不使用旧的默认值Editor Integration编辑器理解UObject和UProperties编辑器可以自动公开这些值以供编辑而不必编写特殊代码可选择在蓝图视觉脚本系统中融入集成也有许多选项可以控制变量和函数的可访问性和公开Run-Time Type Information and Casting由于UObject是引擎反射系统的一部分始终知道UClass并可在运行时做出有关类型的决定和类型转换在原生代码中每个UObject类都将自定义Super类型定义设置为其父类从而可以轻松控制覆盖行为class AEnemy : public ACharacter { virtual void Speak() { Say(Time to fight!); } }; class AMegaBoss : public AEnemy { virtual void Speak() { Say(Powering up! ); Super::Speak(); } }; //调用Speak将会让MegaBoss说Powering up!Time to fight!此外可以使用模板化Cast函数安全地将Object从基类转换为更派生类或使用IsA查询如Object是特定类class ALegendaryWeapon : public AWeapon { void SlayMegaBoss() { TArrayAEnemy EnemyList GetEnemyListFromSomewhere(); // The legendary weapon is only effective against the MegaBoss for (AEnemy Enemy : EnemyList) { AMegaBoss* MegaBoss CastAMegaBoss(Enemy); if (MegaBoss) { Incinerate(MegaBoss); } } } };Garbage Collection虚幻实现了一套垃圾回收机制不再被引用或已被显式标记为销毁的UObject将定期清理引擎构建一个引用图表以确定哪些UObject仍在使用哪些是孤立的该引用图表的根节点是一组被指定为“root set”的UObject任何UObject都可以添加到root set当进行垃圾回收时引擎将从root set开始搜索已知UObject引用树来跟踪所有引用的UObject任何未被引用的UObject意味着未在树搜索中找到这些对象将被假设为不再需要被删除一个实际的影响是通常需要对保持存活的任何Object维护一个UPROPERTY引用无论是一个简单的对象指针或存储在TArray或其他引擎容器类中对象指针Actor及其组件通常属于例外情况因为Actor通常会被可追溯到根集的Object引用如它们所属的关卡而Actor的组件被Actor自身引用可通过调用Destroy函数来显式标记Actor为销毁这是从运行中游戏移除Actor的标准方法组件可以使用DestroyComponent函数显式销毁通常在拥有它们的Actor从游戏中移除时自动销毁引擎中的垃圾回收速度快效率高内置大量的优化功能能够尽量降低开销如用于识别孤立对象的多线程可达性分析及经过优化可尽快将Actor从容器中移除的unhashing代码还有一些其他功能以调节更精准地控制如何以及何时执行垃圾回收大部分都可以在Project Settings/Engine / Garbage Collection下找到Setting(s)Feature DescriptionCreate Garbage Collector UObject Clusters如打开默认打开相关Object将被分组到一起归入垃圾回收集群这样只需要检查集群自身即可而不必检查每个Object将整个集群视为一个对象可更快速地执行可达性分析但也意味着该集群中的单个项目在同一帧中删除如集群足够大可能会导致卡顿一般而言集群创建会提高垃圾回收性能缩短可达性分析耗费的时间Merge GC Clusters当一个簇的对象引用另一个簇中的对象时可以启用簇合并功能使簇能够连接在一起注意清除导致合并的引用并不会使新合并的簇解散或分裂要使此功能生效还需启用Create Garbage Collector UObject Clusters这将使垃圾回收器更少地unhashing和销毁对象但会一次性unhashing和销毁更多对象但在某些情况下合并后的簇可能不会像未合并时那样进行垃圾回收因为对簇中任何对象的任何引用都会阻止整个簇被垃圾回收Actor Clustering Enabled在Project Settings中开启并将bCanBeInCluster变量设置为true或重写代码中的CanBeInCluster函数以使其返回true可以将Actor放入集群中默认Actor和组件会将该选项关闭但静态网格体Actor和反射捕获组件除外此功能对于将预期会一次性全部销毁的Actor通常是指放置在关卡中的静态网格进行打组非常有用这些静态网格只能通过卸载包含它们的子关卡才能销毁Blueprint Clustering Enabled蓝图的UBlueprintGeneratedClass和相关数据如共享UPROPERTY和UFUNCTION数据可以通过打开该设置来建立集群必须要认识到的是该集群引用蓝图生成的类自身而不是蓝图的单个实例Time Between Purging Pending Kill Objects垃圾回收活动的频率可以在项目设置中调整该高级控制对于防止卡顿尤其有用通过缩短回收间隔可以减少将在下一次可达性分析阶段发现的无法访问的对象的可能数量并避免同时清除大量Actor时可能会发生的卡顿Network ReplicationUObject系统包含一组可靠的功能能够促进网络通信和多人游戏UProperties可以标记为告知引擎在网络游戏期间复制数据常见模型是一个变量在服务器上发生更改引擎检测到这个更改并将其可靠地发送到所有客户端当变量通过复制发生更改时客户端可以选择性接收回调函数UFunctions也可以标记为在远程机器上执行如server函数在客户端上调用时将会在服务器上执行这个函数以获取服务器版本的Actor而另一方面client函数可以从服务器调用并在拥有这个函数的客户端版本的对应Actor上运行

相关新闻

Linux rtl88x2bu无线网卡驱动:专业级Wi-Fi适配器解决方案

Linux rtl88x2bu无线网卡驱动:专业级Wi-Fi适配器解决方案

Linux rtl88x2bu无线网卡驱动:专业级Wi-Fi适配器解决方案 【免费下载链接】rtl88x2bu rtl88x2bu driver updated for current kernels. 项目地址: https://gitcode.com/gh_mirrors/rt/rtl88x2bu rtl88x2bu驱动是针对Linux系统的开源Wi-Fi驱动程序&#xff0c…

2026/8/5 18:17:14 阅读更多 →
基于CANoe的uds诊断的配置以及使用

基于CANoe的uds诊断的配置以及使用

概述CANoe中的uds诊断主要用到了Diagnostic/ ISO TP模块,无论是DOIP还是DOCAN,都可以通过该模块来配置。该模块主要通过添加诊断描述来配置uds服务,诊断描述的类型可以是CDD文件,也可以是Basic Diagnostic Description&#xff0c…

2026/8/5 18:17:14 阅读更多 →
Ollama开源的大型语言模型(LLM)平台

Ollama开源的大型语言模型(LLM)平台

Ollama简介 Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等…

2026/8/5 18:17:14 阅读更多 →

最新新闻

小众但暴利的AI模板赛道正在消失——仅剩最后67天窗口期,附可立即复用的5套冷启动SOP

小众但暴利的AI模板赛道正在消失——仅剩最后67天窗口期,附可立即复用的5套冷启动SOP

更多请点击: https://intelliparadigm.com 第一章:AI模板售卖赛道的底层逻辑与窗口期倒计时 AI模板售卖并非简单的内容复刻,而是模型能力、用户场景与商业交付三者耦合的轻量级产品化实践。其底层逻辑根植于“提示工程工业化”——将碎片化P…

2026/8/5 18:55:28 阅读更多 →
联盟营销效率提升300%的秘密,全靠这6类AI工具组合拳——附2024合规白名单清单

联盟营销效率提升300%的秘密,全靠这6类AI工具组合拳——附2024合规白名单清单

更多请点击: https://kaifayun.com 第一章:AI驱动联盟营销的范式革命 传统联盟营销长期受限于人工选品、静态佣金策略与滞后效果归因,而AI正从根本上重构其价值链条。大型广告平台已将实时竞价(RTB)引擎与生成式推荐模…

2026/8/5 18:55:28 阅读更多 →
如何15分钟完成黑苹果配置:智能自动化工具完全指南

如何15分钟完成黑苹果配置:智能自动化工具完全指南

如何15分钟完成黑苹果配置:智能自动化工具完全指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款革命性的黑苹果配…

2026/8/5 18:55:28 阅读更多 →
[virtio](五):virtio-mmio 与 virtio-pci transport

[virtio](五):virtio-mmio 与 virtio-pci transport

第四篇讨论了 virtio notification。本篇看 transport:virtio device 定义设备语义,但 guest 还需要一种方式发现、配置和通知设备。virtio-mmio 与 virtio-pci 就是两种常见 transport。1. device、transport、backend 的区别 virtio 源码里经常同时出现…

2026/8/5 18:55:28 阅读更多 →
终极自动化配置工具:15分钟搞定复杂系统引导配置

终极自动化配置工具:15分钟搞定复杂系统引导配置

终极自动化配置工具:15分钟搞定复杂系统引导配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经因为系统引导配置的复杂性而感…

2026/8/5 18:55:28 阅读更多 →
明日方舟MAA助手完整指南:3步实现游戏自动化,每天节省2小时

明日方舟MAA助手完整指南:3步实现游戏自动化,每天节省2小时

明日方舟MAA助手完整指南:3步实现游戏自动化,每天节省2小时 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地…

2026/8/5 18:54:28 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →