每个线程使用其自己的快速栈分配器进行临时分配。这些分配非常快,生命周期小于一帧。分配器使用后进先出 (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