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

📅 2026/7/1 2:58:32
Unreal Engine 5.7 C++ 完整说明(C++ 标准、内置库、第三方库、内存 GC)
一、UE5.7 使用的 C 标准版本1. 通用桌面 / PCWindows VS、Mac Clang、Linux GCC默认编译标准C17WindowsVS2022 v17.7MSVC/std:c17MacApple Clang 15-stdc17LinuxGCC 12-stdc17引擎内部完全兼容、支持 C20 特性但工程默认不开全局 C20仅平台 SDK 按需启用部分 C20 库如 PS5 平台可切换 stdlib v2C20 标准库Epic Games。2. 主机平台差异PS5默认 stdlib v1C17可手动切 stdlib v2完整 C20 标准库Xbox SeriesC17支持部分 C20 库组件Switch/MobileAndroid/iOSC17 为基线3. 重要编码规范限制官方强制Epic 编码标准不推荐直接大量使用 STLstd::优先用引擎自研容器 / 工具库仅少量 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、跨平台兼容容器库TArray替代std::vector游戏最常用动态数组TMap/TMultiMap哈希表替代std::unordered_mapTSet哈希集合TQueue/TStack队列栈TStaticArray固定栈数组字符串 文本FString可变字符串、FName全局哈希名称、FText本地化文本不使用std::string智能指针非 GC 对象用TSharedPtr/TSharedRef强引用计数无 GC 普通 C 对象TWeakPtr弱引用防循环替代std::weak_ptrTUniquePtr独占指针替代std::unique_ptrTObjectPtrUObject5.7 核心更新GC 追踪智能指针替代裸 UObject*开启增量 GC 必须使用Epic Games数学库跨平台高性能FVector/FVector2D/FVector4、FMatrix/FQuat/FRotatorFMath全套数学函数SIMD 硬件加速封装内存分配工具FMemory底层统一内存接口Malloc/Realloc/FreeTAllocator系列自定义分配器池分配、栈分配、线性分配FMallocBinned默认全局堆分配器反射 / GC 基础UObject基类、UClass、UPROPERTY/UFunction/UENUM反射宏FGCObject非 UObject 持有 UObject 时手动注册引用并发多线程FRunnable、FTaskGraph引擎任务调度替代 std::threadFCriticalSection/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-VBullet可选插件备选物理引擎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自动析构替代裸指针手动 deleteBUObject 派生类Actor、Component、UAsset、蓝图类拥有引擎自动 GC 垃圾回收这就是你问的「自动回收」机制UE 自研标记 - 清扫 GC5.7 大幅优化增量分帧 GCEpic Games。2. UE5.7 GC 自动回收完整机制1核心原理标记清扫 Mark-Sweep根集 Root Set不会被回收的顶层对象World、GameInstance、GameMode、持久 UAsset、手动 AddToRoot 的对象标记阶段从根集递归遍历所有UPROPERTY()/TObjectPtr引用的 UObject标记为存活清扫阶段未被标记的对象标记为 Garbage分帧执行BeginDestroy()-Destroy()-FinishDestroy()释放内存25.7 GC 重大升级增量可达性分析分帧 GC 防卡顿旧版一帧内完整遍历所有对象大型场景会卡顿几百 ms5.7 新特性可达性分析拆分多帧执行可配置每帧最大 GC 耗时强制要求所有 UObject 成员使用TObjectPtrUXXXUPROPERTY()提供写屏障保证引用实时追踪否则 GC 会误删存活对象Epic Games3GC 自动回收生效的前提缺一不可类必须继承UObject带UCLASS()宏对象使用NewObjectUXXX()/CreateDefaultSubobject创建引擎堆分配不在普通 C 堆跨对象引用必须用UPROPERTY()包裹成员或TObjectPtr没有任何根集、任何 UPROPERTY 指向它 → GC 判定为垃圾自动释放4手动干预 GC 的方式AddToRoot()/RemoveFromRoot()强制常驻内存永不回收全局管理器、单例资源MarkAsGarbage()手动标记等待下一轮 GC 清理CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS)手动强制触发完整 GC编辑器调试慎用游戏内会卡帧3. 容易混淆的关键点GC 只管 UObject不管普通结构体 / 容器 / FString示例cpp运行UPROPERTY() UStaticMesh* Mesh; // GC会追踪引用自动管理Mesh内存 TArrayFVector Points; // 普通堆数组退出/清空才释放GC不负责TSharedPtr普通 C 对象智能指针≠ GC TSharedPtr 是引用计数和 UObject GC 两套系统互不兼容不要混用 TSharedPtr 持有 UObject。循环引用不会自动破解 A 持有 B、B 持有 A无外部根引用 → GC 无法识别永久内存泄漏必须手动断引用或用TWeakObjectPtr弱引用。四、总结速查C 标准全局默认 C17完整支持 C20 特性PS5 平台可开启完整 C20 标准库禁止大量直接使用 STL优先引擎自研容器。库体系自研 T 系列容器 / 智能指针 / 数学库为主内置 PhysX、Oodle、libcurl、FBX、USD 等第三方底层库。自动回收 GC仅 UObject 子类拥有自动垃圾回收5.7 支持增量分帧 GC依赖 UPROPERTY/TObjectPtr 追踪引用普通 C 内存无自动回收需手动或 TUniquePtr 管理。