包含此页的版本:
不含此页的版本:
C# 非托管内存层允许访问本机内存层以微调内存分配,并方便地编写 C# 代码。
您可以使用Unity.Collections命名空间(包括NativeArray) 以及 Unity Collections 包中的数据结构来访问 C# 非托管内存。如果使用 Unity 的作业系统或 Burst,则必须使用 C# 非托管内存。
Unity 的本机代码库通过由 Unity 的本机内存管理器管理的内存标签、区域和根系统跟踪本机内存使用情况。这分析器帮助您优化游戏的窗口。它显示了在游戏的各个领域花费了多少时间。例如,它可以报告渲染、动画制作或游戏逻辑所花费的时间百分比。更多信息
请参阅术语表使用本机内存管理器来监视本机内存使用情况。资产垃圾回收器还跟踪继承自UnityEngine.Object因此,在调用Resources.UnloadUnusedAssets它可以清理分配给不再引用的资产的内存。
Unity 的本机内存管理器使用内存标签对内存使用情况进行分类并选择内存使用情况Allocator分配内存。内存管理器对每个内存标签使用的分配器因平台而异。您还可以使用MemoryLabel应用程序接口.重要:这MemoryLabelAPI 与 Collections 包不兼容。
内存管理器使用区域对内存使用情况进行分类,以便进行分析。它使用根来跟踪一个根下的相关内存分配。例如,继承自UnityEngine.Object在该地区有一个根叫做Object.删除对象时,例如通过Resources.UnloadUnusedAssets,与该对象的根关联的所有分配也将被释放。
您可以使用内存分析器包检查按内存标签、区域和根排序的内存使用情况。这包括使用 MemoryLabel 定义的任何自定义标签。还可以发现通过区域名称分配内存的基础分配器。
您可以在Unity.CollectionsNamespace。以这种方式可用的分配器类型包括:
Temp:用于短期分配的临时分配器类型。TempJob:一种临时分配器类型,用于从一个作业传递到另一个作业的更长寿命的分配。Persistent:没有任何时间限制的分配器。AudioKernel:DSP 音频内核分配的分配器。Domain:在域的生命周期内持续的分配器。要使用这些类型,请将Allocator枚举值,以选择要使用的本机分配器类型的内存标签。或者,对于需要自定义分类的低级分配,您可以创建并传递MemoryLabel实例直接分配给分配函数。如果选择Tempallocator 已满,则 Unity 会选择回退分配器(通常TempJob,或 Temp Overflow)。
Temp是 Unity 的临时分配器类型。它专为无法跨越帧边界的小型短期分配而设计,例如在单个作业中进行的临时分配。这Temptype 是 Unity 从主内存池中分配少量内存的堆栈类型分配器。
有多个Temp分配器,每个需要分配器的线程都有一个。Unity 回收Temp分配器每帧确保干净的内存使用模式。但是,如果内存溢出到回退分配器中,则其内存可能会被碎片化。
您可以使用Profiler.GetTempAllocatorSize和Profiler.SetTempAllocatorRequestedSize获取并设置Temp分配器。
的尺寸Temp分配器默认为:
如果超过这些大小,则主线程上的分配将回退到TempJob分配器,在其他线程上,它们回退到 Temp Overflow 分配器。有关临时本机分配的更多信息,请参阅 Thread 本地存储 (TLS) 分配器文档。
此类型使用线性样式分配器,Unity 将其存储在TempJob它从主内存分配的区域。它专为从作业传递到作业的较大临时分配以及可能在帧之间携带数据的临时分配而设计。如果分配在创建后 4 帧内未被处置,则 Unity 编辑器中会显示警告。
注意:如果可用内存耗尽,Unity 会在主内存 (malloc) 中进行溢出分配。大多数平台最多可以有 64 MB 的TempJob内存,但在较小的内存系统上,此限制可低至 16 MB。
如果此分配器已满,则分配回退到临时作业溢出分配器。有关临时作业分配的更多信息,请参阅线程安全线性分配器文档。
此分配器分配内存没有时间限制,仅受设备上可用内存量的限制,因此没有回退。只要你需要它,它就可以存在,但这也意味着只有DisposeSentinel如果不再次释放分配的内存,并且仅当内存的句柄被垃圾回收时,类才会警告你。分配持久内存比分配临时内存慢。