1. 垃圾回收机制概述
在Unreal Engine中,垃圾回收(Garbage Collection,简称GC)是一个核心的内存管理机制。与传统的C++手动内存管理不同,Unreal为UObject及其子类实现了自动内存回收系统。这个系统通过标记-清除算法来识别和回收不再被引用的对象,开发者不再需要手动调用delete来释放内存。
注意:Unreal的GC只作用于UObject及其子类,对于非UObject对象(如F前缀的类型),仍然需要采用传统C++的内存管理方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么Unreal选择标记-清除算法
2.1 引用计数的局限性
许多开发者会好奇为什么Unreal没有采用更简单的引用计数机制。引用计数确实有其直观的优势:
- 每个对象维护一个引用计数器
- 引用时计数器加1
- 解引用时计数器减1
- 计数器归零时立即释放对象
然而,这种机制在游戏开发中存在两个致命缺陷:
-
循环引用问题:当对象A引用对象B,而对象B又引用对象A时,两者的引用计数永远不会归零,导致内存泄漏。在游戏场景中,这种相互引用非常常见(如角色与武器、Actor与组件等)。
-
性能开销:引用计数需要频繁执行原子操作来增减计数器,在多线程环境下会成为性能瓶颈。游戏每帧需要处理大量对象引用,这种开销不可忽视。
2.2 标记-清除算法的优势
标记-清除算法由两个主要阶段组成:
- 标记阶段:从根对象集合出发,遍历所有可达对象并标记为"存活"
- 清除阶段:回收所有未被标记的对象
这种算法能有效解决循环引用问题,且总体性能开销更可控。Unreal在此基础上还实现了增量式GC,将标记工作分摊到多帧完成,避免单帧卡顿。
3. UPROPERTY的核心作用
3.1 引用关系的唯一线索
UPROPERTY宏不仅是编辑器可见的元数据,更是GC系统追踪对象引用关系的唯一依据。当GC运行时:
- 通过反射系统查询对象的属性
- 只关注带有UPROPERTY标记的UObject指针成员
- 沿着这些指针继续追踪引用关系
这意味着任何未标记为UPROPERTY的UObject指针都不会被GC识别为有效引用,可能导致对象被错误回收。
3.2 典型使用场景
cpp复制U
