我刚刚在Unity's docs读到了
Unity的垃圾收集 - 使用Boehm GC算法 - 是非代数和非压缩的。 “非世代”意味着GC在执行收集传递时必须扫描整个堆,因此其性能因堆扩展而降低。 “非压缩”意味着内存中的对象不会重新定位,以便关闭对象之间的间隙。
你是否有人知道或假设为什么Unity使用标准的.Net GC进行中止和压缩?我做了一些测试,我很惊讶甚至来自LOH的对象都在第0代,可能是GC试图用小物体收集它们。
答案 0 :(得分:15)
你注意到了细节,所以这里有一个你应得的细节。
在2008年初,Unity和Mono宣布了他们的合作,当时Unity授权了Mono运行时(GPL涵盖了开源使用)以便嵌入它。 Boehm GC是当时Mono的主要GC。
时间过去了,默认情况下Mono 4.x / 5.x使用带有世代/压缩功能的SGen GC。但是,Unity不想再次支付许可费。因此,您看到文档仍然存在。
微软于2016年收购了Xamarin,因此获得了对Mono核心资产的控制权。它在MIT下重新发布了代码库,因此永远解决许可问题。 Unity加入了.NET Foundation并开始与Microsoft / Xamarin合作,将最新的Mono运行时整合到游戏引擎中。
这项工作仍在进行中,并且很快就会成熟(目前是一项实验性功能)。
顺便说一句,Unity还不能使用标准的.NET GC。 Microsoft没有在.NET Framework中开源GC,而是在.NET Core中开源。 GC与Mono不同,需要更多的努力才能嵌入到Unity中。我猜这就是为什么现在选择Mono 5进行整合的原因。也许将来Unity会迁移到.NET Core GC。有些活动可以在.NET timeline找到。