A Native Collection has not been disposed, resulting in a memory leak. Allocated from:

f:id:sugar_affordance:20201110091446p:plain

A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details.

启用堆栈跟踪

单击 Unity 菜单中的 Jobs > Leak Detection > Full Stack Traces 以选中它。还有记得重启unity

f:id:sugar_affordance:20201110091520p:plain

然后,控制台中的错误内容将显示内存泄漏发生在数据保留位置。

A Native Collection has not been disposed, resulting in a memory leak. Allocated from:
Unity.Entities.BlobAssetStore:.ctor() (at Library/PackageCache/com.unity.entities@0.16.0-preview.21/Unity.Entities.Hybrid/GameObjectConversion/BlobAssetStore.cs:26)
CreateEntitySystem:Setup(Transform) (at Assets/0_MainAssets/Scripts/ECS/System/CreateEntitySystem.cs:116)

关于分配器

NativeContainer(如 NativeArray)在 Dispose 中未释放内存时,会根据某些条件检测为内存泄漏。 条件因分配器的类型而异,分配器是 Allocator.TempJob,在确保本机 Array 时指定。

NativeArray<float> leakArray = new NativeArray<float>(4, Allocator.TempJob);

这是一个详细的解释。

NativeContainer - Unity 手册

如果 Allocator.Temp在函数中没有 Dispose, 否则内存泄漏

确定 Allocator.TempJob必须在 4 帧内释放, 否则内存泄漏确定__Allocator.Persistent 将永久保留,并且不会检测到内存泄漏。

用 using 括起来,确保内存安全

知道泄漏的位置后,我们只是将变量放在 Dispose 中,但**建议在 using语句**中括起来。

using (NativeArray<float> leakArray = new NativeArray<float>(4, Allocator.TempJob)) {

  // 処理

}

这样,当您离开块时,将自动释放变量。 当有多个变量时,请并排排列它们。

using (NativeArray<ArchetypeChunk> chunks = AnimationBatcherQuery.CreateArchetypeChunkArray(Allocator.TempJob))
using (NativeArray<float> leakArray = new NativeArray<float>(4, Allocator.TempJob)) {

  // 処理

}

从 C#8 开始,您可以在 Coco 中并排编写句点,但 Unity 现在像 C#7.3 一样,将来会起作用吗?