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されない!
なので、ハード参照しまくるとエディタでも重くなるかもしれない。
参考文献
- Why are Asset not GCed(RF_StandAlone) by default in Editor – Development / Programming & Scripting – Epic Developer Community Forums
- RF_Standalone: What specifically does it do? – Programming & Scripting / C++ – Epic Developer Community Forums
- EObjectFlags | Unreal Engine 5.7 Documentation | Epic Developer Community


