【问题标题】:C# How Can I Sort A List without Generating Any Garbage at All (Unity3d)C#如何在不产生任何垃圾的情况下对列表进行排序(Unity3d)
【发布时间】:2021-05-21 15:33:31
【问题描述】:

List.Sort 使用的方法最终使用 Array.Sort 生成 2 个字节的垃圾,即使您传入 IComparer 的实例也是如此。我需要在 Unity3d 中的每一帧对许多列表进行排序,所以我需要一种算法,如果可能的话,它不会创建单个字节的垃圾。临时变量的堆栈分配应该没问题。

Unity Profiler Pic

if (comparer == null)
    comparer = (IComparer<T>)Comparer<T>.Default;
if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
    ArraySortHelper<T>.IntrospectiveSort(keys, index, length, comparer);
else
    ArraySortHelper<T>.DepthLimitedQuickSort(keys, index, length + index - 1, comparer, 32);

【问题讨论】:

  • 你确定Array.Sort 分配?你能确定分配了什么吗?
  • 我可能不是垃圾。对于错误检查,网络库向对象添加类型。
  • 如果你能解释为什么你在更新函数中对许多列表进行排序会更好。也许,这里的人可以建议你一个更好的方法来做到这一点。
  • 至少,根据 Unity 分析器,它说它在调用 sort 时分配 2 个字节。排序是我的 VR 框架的要求,这是不可避免的。
  • 呃,你不能在 .NET 中分配一个 2 字节的对象——最小的对象大小是 12 字节。因此,无论您看到什么都不是对象分配。我怀疑您误解了探查器告诉您的内容,无论是什么

标签: c# algorithm sorting unity3d


【解决方案1】:

在这个 github repo 中查看这个库。我在article 的底部发现了这一点,这是关于 LINQ 如何影响 GC 以及在每一帧上可以安全使用的 LINQ 函数。这个库是专门为统一编写的,正如作者所说,这个库是

C# 的 IEnumerator 和 LINQ 的无 GC 版本

有实现快速排序算法并且不会产生垃圾的排序方法。 老实说,我还没有完全测试过它,但我用了多少,它工作得很好。

【讨论】:

  • 谢谢,去看看!
  • 据我所知,它只实现了 InsertionSort。它还提供了一个二进制堆,尽管出于某种原因作者不使用它进行排序。但我没有看到任何快速排序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2020-06-07
  • 2020-11-12
相关资源
最近更新 更多