Unity的垃圾收集器 - 为什么非代际和非压缩?

Wus*_*szt 6 .net c# mono garbage-collection unity-game-engine

我刚读在统一的文档

Unity的垃圾收集 - 使用Boehm GC算法 - 是非代数和非压缩的."非世代"意味着GC在执行收集传递时必须扫描整个堆,因此其性能因堆扩展而降低."非压缩"意味着内存中的对象不会被重新定位以便关闭对象之间的间隙.

有没有人知道或假设为什么Unity使用标准的.Net GC进行中止和压缩?我做了一些测试,我真的很惊讶甚至来自LOH的对象都在第0代,可能是GC试图用小物体收集它们.

Lex*_* Li 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时间轴中找到.