版本:Unity 6 (6000.0)
语言:英语
线程本地存储 (TLS) 栈分配器
自定义分配器

线程安全线性分配器

Unity 中的工作线程使用循环轮询先进先出 (FIFO) 算法来快速、无锁分配作业的工作缓冲区。作业完成后会释放这些缓冲区。

此分配器分配内存块,然后在这些块内线性分配内存。可用块存储在一个池中。当一个块已满时,分配器会从池中获取一个新的块。当分配器不再需要块中的内存时,它会清除该块,然后该块会返回到可用块池中。快速清除分配以使块再次可用非常重要,因此作业不应在分配状态下停留超过几帧。

您可以自定义块大小。分配器根据需要最多分配 64 个块。

Default value for Fast Thread Shared Temporary Allocators for the Editor
编辑器中快速线程共享临时分配器的默认值

如果所有块都在使用中,或者分配对于块来说太大,则分配将回退到主堆分配器,这比作业分配器慢得多。少量溢出分配是可以接受的:一帧中 1 到 10 次,或者几百次,尤其是在加载期间。如果溢出次数随着每帧的增长而增加,您可以增加块大小以避免回退分配。但是,如果您将块大小增加太多(例如,以匹配场景加载等事件中的峰值使用量),您可能会在播放期间留下大量不可用的内存。

例如

[ALLOC_TEMP_JOB_4_FRAMES (JobTemp)]
  Initial Block Size 0.5 MB
  Used Block Count 64
  Overflow Count (too large) 0
  Overflow Count (full) 50408

在此示例使用情况报告中,0.5 MB 的块大小太小,无法容纳应用程序所需的作业内存,并且完全分配导致大量分配溢出。

要检查您的构建的帧溢出是否足够,请运行它一小段时间,然后运行更长时间。如果溢出次数保持稳定,则溢出是在加载期间发生的高水位线。如果溢出次数随着运行时间的延长而增加,则构建正在处理每帧溢出。在这两种情况下,您可以增加块大小来减少溢出,但在加载期间,溢出比每帧都更不重要。

线程本地存储 (TLS) 栈分配器
自定义分配器