桶分配器是一种快速无锁分配器,用于执行小型分配。通常,桶分配器用作加速小型分配的第一步,然后再转到堆分配器。
分配器为分配保留内存块。每个块被划分为大小为 16KB 的子部分。此设置不可配置,并且不会显示在用户界面中。每个子部分又进一步划分为分配。分配大小是配置的固定大小(称为粒度)的倍数。
以下示例配置演示了为分配保留块的过程。
在此设置中,总块大小(桶分配器块大小)为 4MB,分配的粒度(桶分配器粒度)为 16B。第一个分配为 16B,第二个为 32B(2*16),然后是 48B、64B、80B、96B、112B 和 128B,总共八个桶(桶分配器桶数)。
每个子部分包含不同数量的桶。要计算子部分中的桶数,请将子部分大小(16KB)除以粒度大小。例如:
桶分配器针对开发版本开发版本包含调试符号并启用探查器。 更多信息
请参阅术语表和发布版本生成不同的使用报告,因为在开发版本中,每个分配都有一个额外的 40B 标头。下图演示了 16B 和 64B 分配的开发版本和发布版本之间的差异。
标头是分配器在仅分配 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
如果桶分配器已满,分配将回退到另一个分配器。使用报告显示使用统计信息,包括多少分配失败。如果报告显示线性增长的失败计数,则这些失败分配很可能发生在计算帧时,而不是加载时。对于场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,从本质上讲是分段设计和构建游戏。 更多信息
请参阅术语表加载,回退分配不是问题,但如果它们发生在计算帧时,则会影响性能。
要防止这些回退分配,请增加块大小,并将新块大小限制为匹配帧的峰值使用量,而不是场景加载的峰值使用量。这可以防止块变得过大,从而保留大量在运行时不可用的内存。
提示:探查器分配器共享桶分配器的实例。您可以在探查器共享桶分配器中自定义此共享实例。