Unity的垃圾收集器 - 为什么不是分代和压缩的?

9
我刚在Unity文档中读到,Unity的垃圾回收使用Boehm GC算法,是非代际和非压缩的。“非代际”意味着GC在执行收集时必须扫描整个堆,因此随着堆的扩大,性能会下降。“非压缩”意味着内存中的对象不会被重新定位以关闭对象之间的间隙。
有没有人知道或猜测为什么Unity中止使用带有代和压缩功能的标准.Net GC?我做了一些测试,我真的很惊讶,即使是LOH中的对象也在第0代中,可能GC试图用小对象来收集它们。
1个回答

20
你关注了细节,下面来讲一个与细节相关的故事。
早在2008年,Unity和Mono宣布他们的合作,当时Unity获得了授权使用Mono运行时(为开源使用涵盖GPL),以便嵌入其中。而当时Mono的主要GC是Boehm 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时间线中找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接