Version: 6000.3
语言: 中文
动态堆分配器示例
线程本地存储堆栈分配器示例

存储桶分配器示例

先决条件

这些示例使用关闭播放器或 Unity 编辑器时写入日志的内存使用情况报告。要创建这些报告,请使用-log-memory-performance-stats命令行参数。要查找项目的日志文件,请按照日志文件页面上的说明进行作。

示例配置

存储桶分配器保留内存块用于分配。每个块分为 16 KB 的小节。以下示例配置演示了为分配保留块的过程:

适用于 Windows、macOS 和 Linux 播放器的共享存储桶分配器
适用于 Windows、macOS 和 Linux 播放器的共享存储桶分配器

在此设置中,总块大小(Bucket Allocator Block Size)为 4 MB,分配粒度(Bucket Allocator Granularity)为 16 字节。它为其创建存储桶的第一个分配大小为 16 字节,第二个为 32 字节 (2 * 16),然后是 48 个字节、64 个字节、80 个字节、96 个字节、112 个字节和 128 个字节,总共 8 个存储桶(存储桶分配器 BucketCount)。

每个子部分包含不同数量的存储桶。要计算子部分中的存储桶数,请将子部分大小 (16 KB) 除以粒度大小。例如:

  • 当分配粒度为 64 字节时,一个小节适合 256 个存储桶。
  • 当分配粒度为 16 字节时,一个小节适合 1,024 个存储桶。

开发和发布版本比较

存储桶分配器为开发版本和发布版本生成不同的使用情况报告,因为在开发版本开发版本包括调试符号并启用分析器。更多信息
请参阅术语表
每个分配都有一个额外的 40 字节标头。下图演示了 16 字节和 64 字节分配的开发版本和发布版本之间的区别:

开发和发布版本比较
开发和发布版本比较

标头是分配器在仅分配其 4 MB 中的 2 MB 后报告已满的原因:

[ALLOC_BUCKET]
      Large Block size 4.0 MB
      Used Block count 1
      Peak Allocated bytes 2.0 MB
      Failed Allocations. Bucket layout:
        16B: 64 Subsections = 18724 buckets. Failed count: 3889
        32B: 17 Subsections = 3868 buckets. Failed count: 169583
        48B: 31 Subsections = 5771 buckets. Failed count: 39674
        64B: 28 Subsections = 4411 buckets. Failed count: 9981
        80B: 17 Subsections = 2321 buckets. Failed count: 14299
        96B: 6 Subsections = 722 buckets. Failed count: 9384
        112B: 44 Subsections = 4742 buckets. Failed count: 5909
        128B: 49 Subsections = 4778 buckets. Failed count: 8715

在同一项目的发布版本中,分配器块大小就足够了:

[ALLOC_BUCKET]
      Large Block size 4.0 MB
      Used Block count 1
      Peak Allocated bytes 3.3 MB

如果存储桶分配器已满,则分配将回退到另一个分配器。使用情况报告显示使用情况统计信息,包括失败的分配数。如果报表显示的失败计数呈线性增加,则失败分配可能是在计算帧时发生的,而不是负载。回退分配对场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
负载,但如果在计算帧时发生它们,它们可能会影响性能。

要防止这些回退分配,请增加块大小,并限制新的块大小以匹配帧的峰值使用量,而不是场景加载的峰值使用量。这可以防止块变得太大,以至于它保留了大量内存,而这些内存在运行时不可用。

提示Profiler 分配器共享存储桶分配器的实例。您可以在 Profiler 共享存储桶分配器设置中自定义此共享实例。

其他资源

动态堆分配器示例
线程本地存储堆栈分配器示例