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.5 MB 的块大小太小,无法容纳应用程序所需的作业内存,并且完全分配导致大量分配溢出。
要检查您的构建的帧溢出是否足够,请运行它一小段时间,然后运行更长时间。如果溢出次数保持稳定,则溢出是在加载期间发生的高水位线。如果溢出次数随着运行时间的延长而增加,则构建正在处理每帧溢出。在这两种情况下,您可以增加块大小来减少溢出,但在加载期间,溢出比每帧都更不重要。