Unreal Engine 5.7 C++ 完整说明(C++ 标准、内置库、第三方库、内存 GC)

一、UE5.7 使用的 C++ 标准版本

1. 通用桌面 / PC(Windows VS、Mac Clang、Linux GCC)

默认编译标准:C++17

  • Windows:VS2022 v17.7+,MSVC/std:c++17
  • Mac:Apple Clang 15+,-std=c++17
  • Linux:GCC 12+,-std=c++17
  • 引擎内部完全兼容、支持 C++20 特性,但工程默认不开全局 C++20,仅平台 SDK 按需启用部分 C++20 库(如 PS5 平台可切换 stdlib v2=C++20 标准库)Epic Games。

2. 主机平台差异

  • PS5:默认 stdlib v1(C++17),可手动切 stdlib v2(完整 C++20 标准库)
  • Xbox Series:C++17,支持部分 C++20 库组件
  • Switch/Mobile(Android/iOS):C++17 为基线

3. 重要编码规范限制(官方强制)

Epic 编码标准不推荐直接大量使用 STL(std::),优先用引擎自研容器 / 工具库,仅少量 STL 允许有限使用: 允许:<atomic><type_traits><tuple><variant><chrono><thread><mutex>禁止 / 尽量避免:std::vector/std::string/std::map/std::shared_ptr等容器,全部替换为引擎自研容器TArray/FString/TMap/TSharedPtrEpic Games。

二、UE5.7 分两类库:引擎自研核心库 + 内置第三方开源库

(一)引擎自研标准库(日常开发 90% 使用)

全部封装替代 C++ STL,配套引擎内存管理、GC、跨平台兼容:

  1. 容器库
    • TArray:替代std::vector(游戏最常用动态数组)
    • TMap/TMultiMap:哈希表,替代std::unordered_map
    • TSet:哈希集合
    • TQueue/TStack:队列栈
    • TStaticArray:固定栈数组
  2. 字符串 & 文本
    • FString(可变字符串)、FName(全局哈希名称)、FText(本地化文本)
    • 不使用std::string
  3. 智能指针(非 GC 对象用)
    • TSharedPtr/TSharedRef:强引用计数(无 GC 普通 C++ 对象)
    • TWeakPtr:弱引用防循环,替代std::weak_ptr
    • TUniquePtr:独占指针,替代std::unique_ptr
    • TObjectPtr<UObject>:5.7 核心更新,GC 追踪智能指针,替代裸 UObject*,开启增量 GC 必须使用Epic Games
  4. 数学库(跨平台高性能)
    • FVector/FVector2D/FVector4FMatrix/FQuat/FRotator
    • FMath全套数学函数,SIMD 硬件加速封装
  5. 内存分配工具
    • FMemory:底层统一内存接口(Malloc/Realloc/Free)
    • TAllocator系列自定义分配器(池分配、栈分配、线性分配)
    • FMallocBinned默认全局堆分配器
  6. 反射 / GC 基础
    • UObject基类、UClassUPROPERTY/UFunction/UENUM反射宏
    • FGCObject:非 UObject 持有 UObject 时手动注册引用
  7. 并发多线程
    • FRunnableFTaskGraph(引擎任务调度,替代 std::thread)
    • FCriticalSection/FMutex/FEvent同步原语
    • TAtomic原子操作封装

(二)UE5.7 内置第三方开源库(引擎底层依赖,开箱即用)

表格

用途
Oodle / Zlib资源压缩、Pak 包解压
libpng / libjpeg-turbo / WebP图片解码(纹理导入、UI 图片)
FMod / AudioMix音频播放(可选,内置 AudioMixer 自研音频)
PhysX 5.3物理引擎(碰撞、刚体、布料)
OpenSSL / libcurlHTTP/HTTPS 网络、SSL 加密、Web 请求
ICU字符编码、多语言本地化(FText 底层)
glslang / SPIRV-ToolsShader 编译(HLSL/GLSL 转 SPIR-V)
Bullet(可选插件)备选物理引擎
Python 3.11编辑器 Python 脚本(UnrealPython 插件)
Box2D 2D2D 物理插件
Embree光线追踪加速(Lumen 底层)
USD SDKPixar USD 模型导入导出
Autodesk FBX SDKFBX 模型 / 动画导入

三、UE5.7 内存管理 + 自动垃圾回收 GC(核心重点)

1. 两套完全隔离的内存体系

A)普通 C++ 堆内存(非 UObject,无自动回收,必须手动释放
  • 分配:FMemory::Malloc/new/TUniquePtr/TSharedPtr
  • 释放:FMemory::Free/delete
  • 规则:
    • 基础类型、结构体、FVector、TArray、FString 都属于这类
    • 无 GC 自动清理,忘记释放会内存泄漏
    • 推荐用TUniquePtr自动析构,替代裸指针手动 delete
B)UObject 派生类(Actor、Component、UAsset、蓝图类,拥有引擎自动 GC 垃圾回收

这就是你问的「自动回收」机制,UE 自研标记 - 清扫 GC,5.7 大幅优化增量分帧 GCEpic Games。

2. UE5.7 GC 自动回收完整机制

(1)核心原理:标记清扫 Mark-Sweep
  1. 根集 Root Set:不会被回收的顶层对象(World、GameInstance、GameMode、持久 UAsset、手动 AddToRoot 的对象)
  2. 标记阶段:从根集递归遍历所有UPROPERTY()/TObjectPtr引用的 UObject,标记为存活
  3. 清扫阶段:未被标记的对象标记为 Garbage,分帧执行BeginDestroy()->Destroy()->FinishDestroy()释放内存
(2)5.7 GC 重大升级:增量可达性分析(分帧 GC 防卡顿)
  • 旧版:一帧内完整遍历所有对象,大型场景会卡顿几百 ms
  • 5.7 新特性:可达性分析拆分多帧执行,可配置每帧最大 GC 耗时
  • 强制要求:所有 UObject 成员使用TObjectPtr<UXXX>+UPROPERTY(),提供写屏障保证引用实时追踪,否则 GC 会误删存活对象Epic Games
(3)GC 自动回收生效的前提(缺一不可)
  1. 类必须继承UObject,带UCLASS()
  2. 对象使用NewObject<UXXX>()/CreateDefaultSubobject创建(引擎堆分配,不在普通 C++ 堆)
  3. 跨对象引用必须用UPROPERTY()包裹成员,或TObjectPtr
  4. 没有任何根集、任何 UPROPERTY 指向它 → GC 判定为垃圾,自动释放
(4)手动干预 GC 的方式
  • AddToRoot()/RemoveFromRoot():强制常驻内存,永不回收(全局管理器、单例资源)
  • MarkAsGarbage():手动标记等待下一轮 GC 清理
  • CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS):手动强制触发完整 GC(编辑器调试慎用,游戏内会卡帧)

3. 容易混淆的关键点

  1. GC 只管 UObject,不管普通结构体 / 容器 / FString示例:

    cpp

    运行

    UPROPERTY() UStaticMesh* Mesh; // GC会追踪引用,自动管理Mesh内存 TArray<FVector> Points; // 普通堆数组,退出/清空才释放,GC不负责
  2. TSharedPtr(普通 C++ 对象智能指针)≠ GC TSharedPtr 是引用计数,和 UObject GC 两套系统互不兼容;不要混用 TSharedPtr 持有 UObject
  3. 循环引用不会自动破解 A 持有 B、B 持有 A,无外部根引用 → GC 无法识别,永久内存泄漏,必须手动断引用或用TWeakObjectPtr弱引用。

四、总结速查

  1. C++ 标准:全局默认 C++17,完整支持 C++20 特性,PS5 平台可开启完整 C++20 标准库;禁止大量直接使用 STL,优先引擎自研容器。
  2. 库体系:自研 T 系列容器 / 智能指针 / 数学库为主;内置 PhysX、Oodle、libcurl、FBX、USD 等第三方底层库。
  3. 自动回收 GC:仅 UObject 子类拥有自动垃圾回收,5.7 支持增量分帧 GC,依赖 UPROPERTY/TObjectPtr 追踪引用;普通 C++ 内存无自动回收,需手动或 TUniquePtr 管理。