每个线程都使用自己的快速堆栈分配器进行临时分配。这些分配非常快速,生命周期不到一帧。分配器使用后进先出 (LIFO) 堆栈。
临时分配器的默认内存块大小对于平台为 4MB,对于 Unity 编辑器为 16MB。可以自定义这些值。
注意:如果分配器使用量超过配置的内存块大小,Unity 会增加内存块大小。此增加限制为原始大小的两倍。
如果线程的堆栈分配器已满,分配将回退到线程安全线性分配器。少量溢出分配可以接受:一帧中 1 到 10 个,或者加载期间几百个。但是,如果每帧的数量逐步增加,则可以增加内存块大小。
使用情况报告中的信息有助于选择适合应用程序的内存块大小。例如,在以下主线程使用情况报告中,负载峰值为 2.7MB,但剩余帧低于 64KB。可以将内存块大小从 4MB 减小到 64KB,并允许加载帧溢出分配:
[ALLOC_TEMP_TLS] TLS Allocator
StackAllocators :
[ALLOC_TEMP_MAIN]
Peak usage frame count: [16.0 KB-32.0 KB]: 802 frames, [32.0 KB-64.0 KB]: 424 frames, [2.0 MB-4.0 MB]: 1 frames
Initial Block Size 4.0 MB
Current Block Size 4.0 MB
Peak Allocated Bytes 2.7 MB
Overflow Count 0
[ALLOC_TEMP_Job.Worker 18]
在第二个示例中,工作线程不用于大型临时分配。为节省内存,可将工作内存块大小减小到 32KB。这在多核机上特别有用,因为多核机上的每个工作线程都有自己的堆栈:
[ALLOC_TEMP_Job.Worker 14]
Initial Block Size 256.0 KB
Current Block Size 256.0 KB
Peak Allocated Bytes 18.6 KB
Overflow Count 0