内存泄漏本机数组和 UnSafeList

Memory Leak Native Array and UnSafeList

提问人:Berkay Onur 提问时间:11/3/2023 最后编辑:dbcBerkay Onur 更新时间:11/4/2023 访问量:48

问:

我正在使用包含不安全列表的 Unity Native 数组。回退分配会消耗太多时间。一定是内存泄漏,但我无法弄清楚。这是我的代码:

NativeArray < SVerticeKnowledge > SVerticeKnowledges = new NativeArray < SVerticeKnowledge > (VerticeKnowledges.Count, Allocator.TempJob);
for (int i = 0; i < SVerticeKnowledges.Length; i++) {

  UnsafeList < float3 > PosForNode = new UnsafeList < float3 > (VerticeKnowledges[i].PosForNode.Count, Allocator.TempJob);
  UnsafeList < float > Weights = new UnsafeList < float > (VerticeKnowledges[i].Weights.Count, Allocator.TempJob);
  UnsafeList < TransformData > transformDatas = new UnsafeList < TransformData > (VerticeKnowledges[i].ConnectedNode.Count, Allocator.TempJob);
  for (int j = 0; j < VerticeKnowledges[i].PosForNode.Count; j++) {
    PosForNode.AddNoResize(VerticeKnowledges[i].PosForNode[j]);
  }
  for (int j = 0; j < VerticeKnowledges[i].Weights.Count; j++) {
    Weights.AddNoResize(VerticeKnowledges[i].Weights[j]);
  }
  for (int j = 0; j < VerticeKnowledges[i].ConnectedNode.Count; j++) {
    transformDatas.AddNoResize(new TransformData(VerticeKnowledges[i].ConnectedNode[j].position, VerticeKnowledges[i].ConnectedNode[j].rotation, VerticeKnowledges[i].ConnectedNode[j].localScale));
  }

  SVerticeKnowledges[i] = new SVerticeKnowledge(PosForNode, Weights, transformDatas, new TransformData(transform.position, transform.rotation, transform.localScale));

}

var job = new NewPosCalculation() {
  VerticeKnowledges = SVerticeKnowledges
};

JobHandle jobHandle = job.Schedule(SVerticeKnowledges.Length, 1);
jobHandle.Complete();

for (int i = 0; i < VerticeKnowledges.Count; i++) {
  MeshVertices[i] = VerticeKnowledges[i].NewPos;

}
foreach(SVerticeKnowledge vertice_knowledge in SVerticeKnowledges) {
  vertice_knowledge.ConnectedNodeLocalToWorld.Dispose();
  vertice_knowledge.PosForNode.Dispose();
  vertice_knowledge.Weights.Dispose();

}
SVerticeKnowledges.Dispose();

我想修复内存泄漏或耗时高的问题。

C# 数组 unity-game-engine 内存泄漏不 安全

评论

0赞 Dean Van Greunen 11/3/2023
你的问题似乎与Allocator.TempJob
0赞 Dean Van Greunen 11/3/2023
此外,请确保在调用函数之前所有代码都返回并且不会发生错误,还要确保所调用的对象不为 null。DisposeDispose
0赞 Dean Van Greunen 11/3/2023
最好在 Visual Studio 或 Unity 内部使用memory profiler
1赞 dbc 11/3/2023
什么是 Unity 类型 Unity.Collections.NativeArray<T0> 或其他类型?什么是?是 Unity.Collections.LowLevel.Unsafe.UnsafeList<T>吗?什么是?它是托管类型还是非托管类型?您能否编辑您的问题以分享一个最小的可重现示例,显示您的类型并指示您正在使用的库?NativeArray<T>UnsafeList<T>SVerticeKnowledge
0赞 Berkay Onur 11/3/2023
是的,LowLevel.Unsafe。是的,集合 nativearray 。是的,结构是不受管理的。并且 dispose 被称为没有错误。只是消耗了太多时间,看起来像内存泄漏。Allocator.TempJob 有什么问题?

答: 暂无答案