From db332573263ffd491298b906fdc552d935537698 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 14 Sep 2022 20:05:55 +0900 Subject: [PATCH 1/4] =?UTF-8?q?AvatarBuilder.BuildHumanAvatar=20=E3=81=AB?= =?UTF-8?q?=E3=81=AF=E9=9A=A0=E3=82=8C=E3=81=9F=E3=83=9C=E3=83=BC=E3=83=B3?= =?UTF-8?q?=E5=90=8D=20HumanTrait.BoneName=20=E3=81=8C=E5=BF=85=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HumanBodyBones.ToString != HumanTrait.BoneName であることに注意(指のみ。Space) --- .../Runtime/UniHumanoid/AvatarDescription.cs | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index d9ac4c47b..a442d3c7b 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -19,18 +19,31 @@ namespace UniHumanoid public Vector3 max; public Vector3 center; public float axisLength; - private static string[] cashedHumanTraitBoneName = null; - private static readonly Dictionary cachedHumanBodyBonesToBoneNameMap = + + struct BoneTraitName + { + public string WithoutSpace; + public string TraitName; + + public BoneTraitName(string name) + { + TraitName = name; + WithoutSpace = name.Replace(" ", ""); + } + }; + + private static BoneTraitName[] cashedHumanTraitBoneName = null; + private static readonly Dictionary cachedHumanBodyBonesToBoneTraitNameMap = new Dictionary(); static BoneLimit() { // 呼び出し毎にGCが発生するのでキャッシュする string[] boneNames = HumanTrait.BoneName; - cashedHumanTraitBoneName = new string[boneNames.Length]; + cashedHumanTraitBoneName = new BoneTraitName[boneNames.Length]; for (var i = 0; i < boneNames.Length; i++) { - cashedHumanTraitBoneName[i] = boneNames[i].Replace(" ", ""); + cashedHumanTraitBoneName[i] = new BoneTraitName(boneNames[i]); } } @@ -38,7 +51,7 @@ namespace UniHumanoid { return new BoneLimit { - humanBone = (HumanBodyBones) Enum.Parse(typeof(HumanBodyBones), bone.humanName.Replace(" ", ""), true), + humanBone = (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), bone.humanName.Replace(" ", ""), true), boneName = bone.boneName, useDefaultValues = bone.limit.useDefaultValues, min = bone.limit.min, @@ -48,20 +61,20 @@ namespace UniHumanoid }; } - public static String ToHumanBoneName(HumanBodyBones b) + public static String ToHumanBoneTraitName(HumanBodyBones b) { - if (cachedHumanBodyBonesToBoneNameMap.TryGetValue(b, out string result)) + if (cachedHumanBodyBonesToBoneTraitNameMap.TryGetValue(b, out string result)) { return result; } - var bs = b.ToString(); + var boneNameWithoutSpace = b.ToString(); foreach (var x in cashedHumanTraitBoneName) { - if (x == bs) + if (x.WithoutSpace == boneNameWithoutSpace) { - cachedHumanBodyBonesToBoneNameMap[b] = x; - return x; + cachedHumanBodyBonesToBoneTraitNameMap[b] = x.TraitName; + return x.TraitName; } } @@ -73,7 +86,7 @@ namespace UniHumanoid return new HumanBone { boneName = boneName, - humanName = ToHumanBoneName(humanBone), + humanName = ToHumanBoneTraitName(humanBone), limit = new HumanLimit { useDefaultValues = useDefaultValues, From 84aee423ac7bae29bd90a9fbb5dfea03fe4d6351 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 14 Sep 2022 20:33:10 +0900 Subject: [PATCH 2/4] use HumanBodyBones --- Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index a442d3c7b..c11889365 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -22,13 +22,13 @@ namespace UniHumanoid struct BoneTraitName { - public string WithoutSpace; + public HumanBodyBones Bone; public string TraitName; public BoneTraitName(string name) { TraitName = name; - WithoutSpace = name.Replace(" ", ""); + Bone = (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), name.Replace(" ", "")); } }; @@ -68,10 +68,9 @@ namespace UniHumanoid return result; } - var boneNameWithoutSpace = b.ToString(); foreach (var x in cashedHumanTraitBoneName) { - if (x.WithoutSpace == boneNameWithoutSpace) + if (x.Bone == b) { cachedHumanBodyBonesToBoneTraitNameMap[b] = x.TraitName; return x.TraitName; From a0ad60240be1b6d99933a4659b50fbc851c716cf Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 14 Sep 2022 20:42:45 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/UniHumanoid/AvatarDescription.cs | 45 +++---------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index c11889365..4a6ec07f1 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -20,32 +20,11 @@ namespace UniHumanoid public Vector3 center; public float axisLength; - struct BoneTraitName - { - public HumanBodyBones Bone; - public string TraitName; - - public BoneTraitName(string name) - { - TraitName = name; - Bone = (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), name.Replace(" ", "")); - } - }; - - private static BoneTraitName[] cashedHumanTraitBoneName = null; + // HumanTrait.BoneName 呼び出し毎にGCが発生 private static readonly Dictionary cachedHumanBodyBonesToBoneTraitNameMap = - new Dictionary(); - - static BoneLimit() - { - // 呼び出し毎にGCが発生するのでキャッシュする - string[] boneNames = HumanTrait.BoneName; - cashedHumanTraitBoneName = new BoneTraitName[boneNames.Length]; - for (var i = 0; i < boneNames.Length; i++) - { - cashedHumanTraitBoneName[i] = new BoneTraitName(boneNames[i]); - } - } + HumanTrait.BoneName.ToDictionary( + traitName => (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), traitName.Replace(" ", "")), + traitName => traitName); public static BoneLimit From(HumanBone bone) { @@ -63,21 +42,7 @@ namespace UniHumanoid public static String ToHumanBoneTraitName(HumanBodyBones b) { - if (cachedHumanBodyBonesToBoneTraitNameMap.TryGetValue(b, out string result)) - { - return result; - } - - foreach (var x in cashedHumanTraitBoneName) - { - if (x.Bone == b) - { - cachedHumanBodyBonesToBoneTraitNameMap[b] = x.TraitName; - return x.TraitName; - } - } - - throw new KeyNotFoundException(); + return cachedHumanBodyBonesToBoneTraitNameMap[b]; } public HumanBone ToHumanBone() From 1ef079ca58a13473462fe6edc4ef09eecb3f07e7 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 15 Sep 2022 12:52:56 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82Enum.Parse=20=E3=82=92=E5=88=9D?= =?UTF-8?q?=E6=9C=9F=E5=8C=96=E3=81=AB=E7=A7=BB=E5=8B=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/UniHumanoid/AvatarDescription.cs | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs index 4a6ec07f1..061c60b4e 100644 --- a/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs +++ b/Assets/UniGLTF/Runtime/UniHumanoid/AvatarDescription.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; namespace UniHumanoid { + // TODO: BoneLimit.cs に分ける(v0.104以降) [Serializable] public struct BoneLimit { @@ -20,17 +21,33 @@ namespace UniHumanoid public Vector3 center; public float axisLength; - // HumanTrait.BoneName 呼び出し毎にGCが発生 + + // HumanTrait.BoneName は HumanBodyBones.ToString とほぼ一対一に対応するが、 + // 指のボーンについては " " の有無という微妙な違いがある。 + // このスペースは AvatarBuilder.BuildHumanAvatar において必用であり、 + // HumanBodyBones.ToString と区別する必要がある。 + // + // また、下記についてGCが発生するのでキャッシュします。 + // * HumanTrait.BoneName + // * traitName.Replace + // * Enum.Parse + // private static readonly Dictionary cachedHumanBodyBonesToBoneTraitNameMap = HumanTrait.BoneName.ToDictionary( traitName => (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), traitName.Replace(" ", "")), traitName => traitName); + // 逆引き + private static readonly Dictionary cachedBoneTraitNameToHumanBodyBonesMap = + HumanTrait.BoneName.ToDictionary( + traitName => traitName, + traitName => (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), traitName.Replace(" ", ""))); + public static BoneLimit From(HumanBone bone) { return new BoneLimit { - humanBone = (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), bone.humanName.Replace(" ", ""), true), + humanBone = cachedBoneTraitNameToHumanBodyBonesMap[bone.humanName], boneName = bone.boneName, useDefaultValues = bone.limit.useDefaultValues, min = bone.limit.min, @@ -40,17 +57,12 @@ namespace UniHumanoid }; } - public static String ToHumanBoneTraitName(HumanBodyBones b) - { - return cachedHumanBodyBonesToBoneTraitNameMap[b]; - } - public HumanBone ToHumanBone() { return new HumanBone { boneName = boneName, - humanName = ToHumanBoneTraitName(humanBone), + humanName = cachedHumanBodyBonesToBoneTraitNameMap[humanBone], limit = new HumanLimit { useDefaultValues = useDefaultValues,