注意:本部分中关于分配器的信息仅适用于本机内存,不适用于托管堆(托管内存部分对此进行了介绍)。本部分假定您已大致了解本机内存管理和分配器。
应用程序使用内存分配器来平衡性能和可用内存空间。如果应用程序有大量空闲内存,则在加载场景和帧时,可支持速度更快、内存占用量更大的分配器。但是,如果应用程序的内存有限,则需要高效使用该内存,而这也意味着使用速度较慢的分配器。为了帮助您在不同的项目中获得最佳性能,您可以自定义 Unity 的分配器以适应每个应用程序的大小并满足其要求。
Unity 提供五种分配器类型。每种类型都有不同的算法,用于将分配放入内存块中,因此可用于不同的分配。分配之间的重要区别通常在于持久性或分配生命周期,这决定了分配应该流向何处。例如,长效(持久)分配将进入堆分配器和存储桶分配器,而短效分配将进入线程安全的线性分配器和 TLS 分配器。
下表列出了每种分配器类型的算法和用途:
| 分配器类型 | 算法 | 用途 |
|---|---|---|
| 动态堆 | Two Level Segregated Fit (TLSF) | • 主分配器 • Gfx 分配器 • 类型树分配器 • 文件缓存分配器 • 性能分析器分配器 • 编辑器性能分析器分配器(仅适用于编辑器) |
| 存储桶 | 固定大小的无锁分配器 | 作为小型分配的共享分配器,用于以下用途: • 主分配器 • Gfx 分配器 • 类型树分配器 • 文件缓存分配器 |
| 双线程 | 根据大小和线程 ID 重定向分配 | • 主分配器 • Gfx 分配器 • 类型树分配器 • 文件缓存分配器 |
| 线程局部存储 (TLS) 堆栈 | LIFO 堆栈 | 临时分配 |
| 线程安全线性 | 循环 FIFO | 将数据传递给作业的缓冲区 |
注意:本文档中的示例使用在关闭播放器或编辑器时写入日志的内存使用情况报告(如果使用了
-log-memory-performance-stats命令行参数)。要查找日志文件,请按照日志文件页面上的说明操作。