From aac707d187febd36e6a805ea8ba592b767c56ccc Mon Sep 17 00:00:00 2001 From: Takayuki Matsuoka Date: Wed, 7 Sep 2022 16:56:46 +0900 Subject: [PATCH] Optimize UniHumanoid.BoneLimit.ToHumanBoneName This change optimizes the following points: (1) Replace linear search for "cashedHumanTraitBoneName" with Dictionary. (2) Avoid GC alloc in the inner loop. (2a) Do b.ToString() at the outside of the loop. (2b) Do x.Replace(" ", "") at once in the static constructor of BoneLimit. --- .../Runtime/UniHumanoid/AvatarDescription.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index 05a3abd6e..d9ac4c47b 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -20,6 +20,19 @@ namespace UniHumanoid public Vector3 center; public float axisLength; private static string[] cashedHumanTraitBoneName = null; + private static readonly Dictionary cachedHumanBodyBonesToBoneNameMap = + new Dictionary(); + + static BoneLimit() + { + // 呼び出し毎にGCが発生するのでキャッシュする + string[] boneNames = HumanTrait.BoneName; + cashedHumanTraitBoneName = new string[boneNames.Length]; + for (var i = 0; i < boneNames.Length; i++) + { + cashedHumanTraitBoneName[i] = boneNames[i].Replace(" ", ""); + } + } public static BoneLimit From(HumanBone bone) { @@ -37,16 +50,17 @@ namespace UniHumanoid public static String ToHumanBoneName(HumanBodyBones b) { - // 呼び出し毎にGCが発生するのでキャッシュする - if (cashedHumanTraitBoneName == null) + if (cachedHumanBodyBonesToBoneNameMap.TryGetValue(b, out string result)) { - cashedHumanTraitBoneName = HumanTrait.BoneName; + return result; } + var bs = b.ToString(); foreach (var x in cashedHumanTraitBoneName) { - if (x.Replace(" ", "") == b.ToString()) + if (x == bs) { + cachedHumanBodyBonesToBoneNameMap[b] = x; return x; } }