Unreal Engine 内存池浅谈------总结篇
写在最后:这一套东西我陪你从 Binned1 讲到 Binned3,讲到甘蔗店,讲到移动端血泪史,现在全部浓缩成一张表 + 10 条金句,贴墙上当传家宝。
官方内存分配器终极对比表
| 分配器 | 适用平台 | 小块速度 | 内存利用率 | 碎片控制 | 移动端友好度 | 2025 年推荐指数 | 一句话评价 |
|---|---|---|---|---|---|---|---|
| Binned1 | 考古级(UE3) | 30~80ns | 85% | 中等 | ★★★★☆ | ★☆☆☆☆ | 老古董,Free 要传 Size |
| Binned2 | 移动端/主机/Switch | 15~30ns | 92% | 优秀 | ★★★★★ | ★★★★★ | 移动端永远的神 |
| Binned3 | PC/高端主机/车载 | 8~15ns | 96%+ | 极致 | ★☆☆☆☆ | ★★★★★ | PC 王者,移动端毒药 |
| TBB | Windows 高并发服务器 | 20~40ns | 90% | 好 | ★★☆☆☆ | ★★★★☆ | 服务器专用 |
| Jemalloc | Linux 服务器 | 25~50ns | 88% | 好 | ★★☆☆☆ | ★★★☆☆ | 老将,但不如 Binned |
| 系统 malloc | 兜底 | 200~800ns | 60~75% | 差 | ★☆☆☆☆ | ★☆☆☆☆ | 永远不要默认用 |
2025 年项目选型铁律
- 移动端(Android/iOS/Switch) → 强制 Binned2(-UseMallocBinned2)
- PC/主机/高端车载 → 默认 Binned3 + ThreadCache 256 + PageSize 131072
- 服务器/工具 → TBB 或 Jemalloc(看平台)
- 每帧临时对象 → Frame Arena / FScopedScratchMemory
- 热点 TArray → TPoolAllocator
- 大纹理/网格 → 自定义大块池或 FMallocLarge
- 长时间运行不膨胀 → Binned2 + 固定 Hash 表 + Bundle 归还
- 想卷性能 → 自己写瑞士表 + wyhash + SIMD 位图(能干到 8ns)
- 想躺平 → Binned3 默认配置 + 开箱即用
- 永远别干的事 → 在移动端开 Binned3、在 GameThread 里 new 小对象
十句金句
- Binned3 是核弹,移动端是核废料。
- 移动端第一步永远是:把 Binned3 关了。
- 每帧分配 >1ms,必开 Frame Arena。
- 热点 TArray 不换 TPoolAllocator,就是自愿掉帧。
- 哈希表快 1ns,帧率就能多 1 帧。
- 负载因子 >0.75,就是在给 GC 送人头。
- 移动端敢开 RHIThread,就是在给驱动送 Bug。
- 8ns 分配不是神话,Binned3 + 瑞士表 + SIMD 位图,2025 年随便拿。
- 内存池不是配置,是信仰。
- 学会了 Binned,你就学会了 UE 性能的一半。
至此,Unreal Engine 内存池浅谈系列完结。
从 41 个抽屉到 8 纳秒,从甘蔗店到车载核弹,
我们一起把 Epic 这 19 年的黑魔法彻底拆穿了。
愿你在 2025 年的每个项目里,都不再被内存池支配恐惧。
------ 写给所有还在和 UE 内存战斗的你,
下次见!