UE4 内存池浅谈[3]——3代内存池对比总观

Unreal Binned 系列完整对比表(含 Binned1 / Binned2 / Binned3)

项目 Binned1(UE3 ~ UE4.5) Binned2(UE4.8 ~ UE5.3 移动端主力) Binned3(UE5 默认,2025 王者)
首次出现版本 UE3 (2006~2013) UE4.8 (2015) UE4.20 (2018),UE5 默认
当前状态(2025) 完全废弃 移动端/低端主机/Switch 强制使用 PC/主机默认首选
支持平台 32/64位全支持 32/64位全支持 仅64位(依赖超大虚拟地址空间)
Page 大小 固定 64KB 固定 64KB 多级 4KB/8KB/16KB/32KB/64KB
虚拟内存策略 传统 VirtualAlloc 批量预留 + Hold 不还 OS(防 VMA 爆炸) 巨型预留(每个 Bin 1~4GB)+ 按需 Commit
Free 接口 Free(void* Ptr, SIZE_T Size) *Free(void Ptr)** 只传指针! *Free(void Ptr)** 只传指针!
Free 时反查方式 指针算术 (Ptr & ~0xFFFF) 全局 Hash Bucket Table + 线性探测 更强多级 Hash + Bundle 回收
线程缓存规模 小(16~32块/线程) 中等(32~64块)+ 批量转移 超大(64~256块)+ 位图加速
空闲块管理 简单链表 链表 + 部分位图 位图 + 硬件 _tzcnt + Bundle
内部碎片率 高(~15%) 中等(~8%) 极低(<4%)
内存利用率 ~85% ~92% 96%+
分配速度(16字节) 30~80ns 15~30ns 8~15ns
多线程竞争 有全局锁 细粒度锁 + 批量转移 几乎零锁(Per-Thread Cache 主导)
移动端兼容性 优秀 优秀(Android VMA 上限问题已解决) 差(iOS/Android 不默认,大项目切回 Binned2)
典型问题 碎片严重、Free 要传 Size Android 老设备 VMA 限制 Switch 等极端场景 CPU 略高 1~2ms
2025 年使用建议 别碰 移动端/低内存平台强制 PC/主机/高性能项目首选

一句话总结三代进化史

  • Binned1:原始玩具版,固定 Page + 必须传 Size → 基本没人用
  • Binned2:第一次真正可用,引入"只传 Ptr 的 Free + 全局 Hash Table"黑魔法 → UE4 时代王者,至今移动端还在用
  • Binned3:64位时代核弹,多 PageSize + 巨型线程缓存 + 位图 + Bundle → 把内存利用率和速度同时拉到物理极限 → 2025 年 PC/主机默认神器

如果你现在开新项目:

  • PC / 主机 / 高通8295P 车载 → 直接 Binned3
  • Android / iOS / Switch → 强制 Binned2(-UseMallocBinned2)
  • 考古级 UE3 项目 → 只能含泪用 Binned1

Unreal Binned 系列三代完整流程对比

Binned1

是 超快 否 是 超慢 否 否 推荐 是 Malloc Size 计算 BinIndex 64KB页 线程缓存命中? 直接返回 无锁 Global FreeList 拿一块 全局空? VirtualAlloc 新64KB
全部切块进FreeList Free Ptr Size 必须传Size Ptr反算Bin 放回线程缓存 线程缓存满? 成功 无锁 归还全局 有锁

Binned2

是 超快 否 否 是 否 是 Malloc Size 计算 BinIndex 固定64KB页 线程缓存命中? 32到64块 无锁直接返回块 批量从 Global Pool 拿32块 把拿到的每块登记进全局 Hash Bucket Table Free 只传 Ptr 用 Ptr 计算哈希值 线性探测全局 Hash Bucket Table 找到匹配桶? 继续探测 或 兜底处理 立刻知道原始 BlockSize 无锁放回线程缓存 线程缓存已满? 成功 超快 批量归还 Global Pool

Binned3

是 8到15ns 否 否 极罕见 是 99.99% 否 推荐 是 Malloc Size 计算 Bin + PageSizeIdx
支持多级页面 4KB到64KB 线程缓存命中?
64到256块 + 位图加速 无锁直接返回
核弹级速度 批量从 Global Pool
拿32到64块 登记进全局多级 Hash Bucket
Ptr -> Bin+PageSizeIdx Free 只传 Ptr 黄金比率哈希
Ptr -> 高质量哈希 线性探测 + 地址范围二次校验 找到正确桶? 兜底慢路径 瞬间知道原始 BlockSize
和 PageSize 无锁放回线程缓存 线程缓存已满? 成功 核弹速度 Bundle批量归还
位图 + tzcnt 加速
空闲整页直接还OS

三代进化核心一句话:

Binned1:必须传 Size + 固定 Page + 小缓存 → 勉强能用

Binned2:第一次实现只传 Ptr + 全局 Hash + 批量转移 → UE4 时代王者

Binned3:多 PageSize + 巨型缓存 + 位图 + Bundle + 黄金哈希 → 把性能和内存利用率同时拉到物理极限,2025 年仍是实时渲染界最强小块内存池。

相关推荐
询问QQ:688238861 天前
Labview交通灯程序设计——机动车道与人行道绿灯时间设置带报告
ue4
郝学胜-神的一滴1 天前
OpenGL错误检查与封装:构建健壮的图形渲染系统
开发语言·c++·程序人生·软件工程·图形渲染
倾心唯恋2 天前
更新Epic后通过工程路径和Epic双击打不开UE4项目,提示Failed to launch editor的解决办法
ue4
2501_938931332 天前
UE4SS-RE 安装全指南:基础环境变量设置到高级跨版本部署适配
ue4
小宝哥Code2 天前
UE5在布局自定义上的UE4ClassicLayout.ini文件源码解读分析
java·ue5·ue4
DBBH2 天前
Cesium源码分析之渲染3DTile的一点思考
图形渲染·webgl·cesium.js
BoBoZz193 天前
OrientedArrow 在两个随机生成的点之间绘制一根带箭头的线,以可视化一个向量
python·vtk·图形渲染·图形处理
T***u3334 天前
PHP在电商中的会员管理
开发语言·wireshark·php·ue4·jina
郝学胜-神的一滴4 天前
现代OpenGL窗口管理:GLFW从入门到实战
开发语言·c++·程序人生·图形渲染·个人开发