Version: 6000.3
语言: 中文
线程本地存储堆栈分配器示例
非托管 C# 内存

线程安全线性分配器示例

先决条件

这些示例使用了 Unity 在您关闭播放器或 Unity 编辑器时写入日志的内存使用情况报告。要创建这些报告,请使用-log-memory-performance-stats命令行参数。要查找项目的日志文件,请按照日志文件页面上的说明进行作。

分配器概述

此分配器分配内存块,然后在这些块内线性分配内存。Unity 将可用块保存在池中。当一个块已满时,分配器从池中获取一个新块。当分配器不再需要块中的内存时,它会清除该块,并且该块将返回到可用块的池中。

您可以自定义块大小。分配器根据需要最多分配 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 的块大小太小,无法容纳应用程序所需的作业内存,并且完整分配器导致许多分配溢出。

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

其他资源

线程本地存储堆栈分配器示例
非托管 C# 内存