Version: Unity 6.0 (6000.0)
语言 : 中文
线程局部存储 (TLS) 堆栈分配器
Unmanaged C# memory

线程安全线性分配器

Unity 中的工作线程使用循环先进先出 (FIFO) 算法为作业快速、无锁地分配工作缓冲区。作业完成后会处置缓冲区。

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

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

编辑器的快速线程共享临时分配器的默认值
编辑器的快速线程共享临时分配器的默认值

如果所有内存块都在使用中,或者某个分配对于内存块来说太大,则分配会回退到主堆分配器,这会比作业分配器花费更多时间。少量溢出分配可以接受:一帧中 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.5MB 的内存块太小,无法容纳应用程序所需的作业内存,并且分配器已满,导致大量分配溢出。

要检查构建的帧溢出是否足够,请在短时间内运行构建,然后延长运行时间。如果溢出计数保持稳定,则溢出是在加载期间出现的峰值标记。如果溢出计数随着运行时间延长而增加,则构建正在处理每帧溢出。在这两种情况下,都可以增加内存块大小以减少溢出,但加载期间溢出的重要性低于每帧溢出。

线程局部存储 (TLS) 堆栈分配器
Unmanaged C# memory