2017-10-04 10 views
3

私はちょうどUnityのガベージコレクタ - なぜ非世代で圧縮されていないのですか?

ユニティのガベージコレクションというUnity's docsに読んだ - ベームGCアルゴリズムを使用しています - 非世代と非圧縮です。 「非世代」とは、GCがコレクション・パスを実行するときにGC全体をスイープしなければならないことを意味します。そのため、ヒープが拡大するにつれてパフォーマンスが低下します。 「非圧縮」とは、オブジェクト間のギャップを埋めるためにメモリ内のオブジェクトが再配置されないことを意味します。

世代と圧縮で標準の.Net GCを使用してUnityが異常終了する理由を知っている人は誰ですか?私はいくつかのテストを行いました.LOHのオブジェクトさえも世代0にあり、おそらくGCが小さなオブジェクトでそれらを収集しようとしていることに本当に驚いています。

答えて

9

あなたは細部に注意を払ったので、ここではあなたが値する詳細の話が来ます。

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をまだ使用できません。マイクロソフトでは、GCを.NET Frameworkでオープンしているのではなく、.NET Coreのバージョンをオープンしています。そのGCはMonoとは異なり、Unityに組み込むためにより多くの努力が必要です。 Mono 5が今すぐ統合されるように選択された理由はそうだと思います。将来的にUnityは.NET Core GCに移行するでしょう。

イベントの一部は.NET timelineにあります。

関連する問題