circle-loader
by
55/ 0

1、UE4GCの概要

UE4には、一連のUObjectオブジェクトシステムが構築され、ガベージコレクションメカニズムも追加されました。これにより、ゲーム開発にC ++を使用しやすくなり、ゲーム自体でメモリリークの問題を大幅に回避できます。

UE4は、従来のガベージコレクション方式である「マーク・パージ」というガベージコレクション方式を採用しています。ガベージコレクションは2つの段階に分かれています。第一段階はあるルートコレクションから始まり、到達可能なすべてのオブジェクトをトラバースします。トラバースが完了すると、到達可能なオブジェクトと到達不可能なオブジェクトにマークを付けることができます。このステージは1フレームで完了します。第2段階では、これらの到達不能なオブジェクトを徐々にパージします。到達不能なオブジェクトにはアクセスできないため、一度に多くのUObjectがパージされ(例えば、mapがアンロードされると、明らかなフリーズが発生します。)ないように、フレーム内でパージできます。

GCはゲームスレッドで発生し、UObjectをパージし、マルチスレッドGCをサポートします。

ゲーム内で最大のUObjectオブジェクトを指定するMaxObjectsInGameなど、いくつかのパラメーターをGCに設定できます(エディターでは有効になりません)。モバイルプラットフォームのデフォルト設定は131072です。UObjectの数がこのしきい値を超えると、ゲームがクラッシュします。その他の詳細なパラメーター関連するプロパティは、UGarbageCollectionSettings、GarbageCollection.cpp、およびUnrealEngine.cppで確認できます。

次の図は、マークパージの動作原理を示しています。


 

1.1GCの開始時期:

UE4のGCは、アクティブトリガーと自動トリガーの2つの方法に分けることができます。

1.1.1アクティブトリガー

ある操作を実行する同時に手動で呼び出せます。例えば、アセットをアンロードするとすぐにGCを呼び出してパージすることができます。

そして、多くの方法があります。例えば、ゲームはForceGarbageCollectionを呼び出して、Worldに次のtickでガベージコレクションを実行させることができます。また、CollectGarbageを直接呼び出すこともできます。エンジンのほとんどの状況は、この方法でアクティブにトリガーされます。

1.1.2自動トリガー

ゲームでは、ほとんどのガベージコレクション操作はUE4によって自動的にトリガーされます。通常の状況では、手動でGCを呼び出す必要はありません。これは、GCを使用するための理想的な方法でもあります。

World tickが発生すると、UEngine::ConditionalCollectGarbage()関数が呼び出され、関数でいくつかの判断が行われます。GC条件が満たされると、GCが実行されます。ConditionalCollectGarbageの実行ロジックを分析してみましょう。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式QAコミュニティ(中国語注意)https://answer.uwa4d.com