Fix quadratic time behavior on exception

Previously, processing would abort before clearing AvatarTagComponents when an exception
is thrown. This would result in unprocessed AvatarTagComponents re-triggering processing
as part of their Awake callback, causing O(n^2) behavior.
This commit is contained in:
bd_ 2022-11-24 17:19:37 -08:00
parent 7ed1593bda
commit d2f8c22ac8

View File

@ -109,6 +109,8 @@ namespace nadena.dev.modular_avatar.core.editor
BoneDatabase.ResetBones(); BoneDatabase.ResetBones();
PathMappings.Clear(); PathMappings.Clear();
try
{
new RenameParametersHook().OnPreprocessAvatar(avatarGameObject); new RenameParametersHook().OnPreprocessAvatar(avatarGameObject);
new MenuInstallHook().OnPreprocessAvatar(avatarGameObject); new MenuInstallHook().OnPreprocessAvatar(avatarGameObject);
new MergeArmatureHook().OnPreprocessAvatar(avatarGameObject); new MergeArmatureHook().OnPreprocessAvatar(avatarGameObject);
@ -119,11 +121,16 @@ namespace nadena.dev.modular_avatar.core.editor
new BlendshapeSyncAnimationProcessor().OnPreprocessAvatar(avatarGameObject); new BlendshapeSyncAnimationProcessor().OnPreprocessAvatar(avatarGameObject);
AfterProcessing?.Invoke(avatarGameObject); AfterProcessing?.Invoke(avatarGameObject);
}
finally
{
// Ensure that we clean up AvatarTagComponents after failed processing. This ensures we don't re-enter
// processing from the Awake method on the unprocessed AvatarTagComponents
foreach (var component in avatarGameObject.GetComponentsInChildren<AvatarTagComponent>(true)) foreach (var component in avatarGameObject.GetComponentsInChildren<AvatarTagComponent>(true))
{ {
UnityEngine.Object.DestroyImmediate(component); UnityEngine.Object.DestroyImmediate(component);
} }
}
// The VRCSDK captures some debug information about animators as part of the build process, prior to invoking // The VRCSDK captures some debug information about animators as part of the build process, prior to invoking
// hooks. For some reason this happens in the ValidateFeatures call on the SDK builder. Reinvoke it to // hooks. For some reason this happens in the ValidateFeatures call on the SDK builder. Reinvoke it to