suzuryg / face-emo

FaceEmo: Face emote configuration tool for VRChat Avatars 3.0
https://suzuryg.github.io/face-emo/
Other
46 stars 5 forks source link

en_us Localeでは、ScriptableObjectのリークが発生します #136

Closed bdunderscore closed 1 month ago

bdunderscore commented 2 months ago

https://github.com/suzuryg/face-emo/blob/261ab2c18b55ca90736efe639a5b40d790011b61/Packages/jp.suzuryg.face-emo/Editor/Detail/Localization/LocalizationSetting.cs#L90

この件はLocalizationTableをリークしてしまい、C#オブジェクトと違ってエディター再起動までヒープに残ってしまいます。そのため、Resources.FindObjectsByTypeAllなどのヘルパーが非常に重くなり、いろんな操作が重くなります。

リークを確認した時点では16GBほどのヒープサイズになってました(メモリーダンプは解析できなかったので確定ではないが、再起動した後はここだけが急速に増えてました)

ハックではありますが、このような修正を入れたらオブジェクトの増加が止まりました


        private static LocalizationTable en_us;

        public static LocalizationTable GetTable(Locale locale)
        {
            if (locale == Locale.ja_JP)
            {
                return AssetDatabase.LoadAssetAtPath<LocalizationTable>($"{DetailConstants.LocalizationDirectory}/ja_JP.asset");
            }
            else
            {
                // en_US has the table in source code, not asset.
                en_us = en_us != null ? en_us : ScriptableObject.CreateInstance<LocalizationTable>();

                return en_us;
            }
        }