版本:Unity 6 (6000.0)
语言:English
动态堆分配器
双线程分配器

桶分配器

桶分配器是一种快速无锁分配器,用于执行小型分配。通常,桶分配器用作加速小型分配的第一步,然后再转到堆分配器。

分配器为分配保留内存块。每个块被划分为大小为 16KB 的子部分。此设置不可配置,并且不会显示在用户界面中。每个子部分又进一步划分为分配。分配大小是配置的固定大小(称为粒度)的倍数。

示例配置

以下示例配置演示了为分配保留块的过程。

Shared Bucket Allocator for the Windows, Mac and Linux Player
Windows、Mac 和 Linux 播放器的共享桶分配器

在此设置中,总大小(桶分配器块大小)为 4MB,分配的粒度(桶分配器粒度)为 16B。第一个分配为 16B,第二个为 32B(2*16),然后是 48B、64B、80B、96B、112B 和 128B,总共八个桶(桶分配器桶数)。

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

  • 当分配粒度为 64B 时,一个子部分可以容纳 256 个桶。
  • 当分配粒度为 16B 时,一个子部分可以容纳 1,024 个桶。

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

桶分配器针对开发版本开发版本包含调试符号并启用探查器。 更多信息
请参阅术语表
和发布版本生成不同的使用报告,因为在开发版本中,每个分配都有一个额外的 40B 标头。下图演示了 16B 和 64B 分配的开发版本和发布版本之间的差异。

Development and Release builds comparison
开发版本和发布版本的比较

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

[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

如果桶分配器已满,分配将回退到另一个分配器。使用报告显示使用统计信息,包括多少分配失败。如果报告显示线性增长的失败计数,则这些失败分配很可能发生在计算帧时,而不是加载时。对于场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,从本质上讲是分段设计和构建游戏。 更多信息
请参阅术语表
加载,回退分配不是问题,但如果它们发生在计算帧时,则会影响性能。

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

提示:探查器分配器共享桶分配器的实例。您可以在探查器共享桶分配器中自定义此共享实例。

动态堆分配器
双线程分配器