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 年仍是实时渲染界最强小块内存池。