[UE] GCの挙動がエディタとパッケージで異なる

UnrealEngineEditorにてReferenceChaineSearchを使って最適化をしていると
以下のログを見かけることになります。

(アセット名) is not currently reachable but it does have some of GARBAGE_COLLECTION_KEEPFLAGS set.

あれ? 参照されてるものが無いはずなのに
なんかよくわからんが、GCされてないぞ?

もちろん。強制的にGCするコマンドをしてもこれはそのままです。

なぜ、その挙動をするか調べてみる

GabargeCollection.hにありました。GARBAGE_COLLECTION_KEEPFLAGS

#define GARBAGE_COLLECTION_KEEPFLAGS	(GIsEditor ? RF_Standalone : RF_NoFlags)

どうやらエディタではRF_Standaloneのフラグがついていると
ガベージコレクションされないような判定をしてるみたい。

CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS)もやたらと見かけますが
引数はキープするフラグは何なのかの指定っぽい。

RF_Standalone はなんぞ

ObjectMacros.h で宣言されています。

Keep object around for editing even if unreferenced.

リファレンスが無くても、編集のために保持すると書かれていますね。

SavePackage2.cppのValidatePackage関数を見ると

If An asset is provided, validate it has the requested TopLevelFlags. This is necessary to prevent dataloss, but only
when saving packages to the WorkspaceDomain

The Asset %s being saved is missing the RF_Standalone flag; adding it.

どうやら、AssetはRF_Standaloneのフラグを持っていてほしいらしいです!

そうなると、Assetは基本的にRF_Standaloneを持つと。

結論

エディタ(PIEも含む)でロードされたAssetは基本GCされない!
なので、ハード参照しまくるとエディタでも重くなるかもしれない。

参考文献