Skip to content

Commit

Permalink
Merge pull request #413 from Kohei-Yanagida/suppress_gc_due_to_using_…
Browse files Browse the repository at this point in the history
…LINQ

Suppress gabage collection due to using linq
  • Loading branch information
hiroj authored May 26, 2020
2 parents 56cdfe8 + 4162844 commit ab4cf96
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 42 deletions.
39 changes: 33 additions & 6 deletions Assets/VRM/UniHumanoid/Scripts/AvatarDescription.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ public struct BoneLimit
public Vector3 max;
public Vector3 center;
public float axisLength;
private static string[] cashedHumanTraitBoneName = null;

public static BoneLimit From(HumanBone bone)
{
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,
Expand All @@ -36,7 +37,13 @@ public static BoneLimit From(HumanBone bone)

public static String ToHumanBoneName(HumanBodyBones b)
{
foreach (var x in HumanTrait.BoneName)
// 呼び出し毎にGCが発生するのでキャッシュする
if (cashedHumanTraitBoneName == null)
{
cashedHumanTraitBoneName = HumanTrait.BoneName;
}

foreach (var x in cashedHumanTraitBoneName)
{
if (x.Replace(" ", "") == b.ToString())
{
Expand Down Expand Up @@ -80,10 +87,28 @@ public class AvatarDescription : ScriptableObject

public HumanDescription ToHumanDescription(Transform root)
{
var transforms = root.GetComponentsInChildren<Transform>();
var skeletonBones = new SkeletonBone[transforms.Length];
var index = 0;
foreach (var t in transforms)
{
skeletonBones[index] = t.ToSkeletonBone();
index++;
}

var humanBones = new HumanBone[human.Length];
index = 0;
foreach (var bonelimit in human)
{
humanBones[index] = bonelimit.ToHumanBone();
index++;
}


return new HumanDescription
{
skeleton = root.Traverse().Select(x => x.ToSkeletonBone()).ToArray(),
human = human.Select(x => x.ToHumanBone()).ToArray(),
skeleton = skeletonBones,
human = humanBones,
armStretch = armStretch,
legStretch = legStretch,
upperArmTwist = upperArmTwist,
Expand Down Expand Up @@ -154,7 +179,7 @@ public static AvatarDescription CreateFrom(HumanDescription description)
return avatarDescription;
}

public static AvatarDescription Create(AvatarDescription src=null)
public static AvatarDescription Create(AvatarDescription src = null)
{
var avatarDescription = ScriptableObject.CreateInstance<AvatarDescription>();
avatarDescription.name = "AvatarDescription";
Expand All @@ -178,6 +203,7 @@ public static AvatarDescription Create(AvatarDescription src=null)
avatarDescription.upperLegTwist = 0.5f;
avatarDescription.lowerLegTwist = 0.5f;
}

return avatarDescription;
}

Expand Down Expand Up @@ -235,8 +261,9 @@ public static bool GetHumanDescription(UnityEngine.Object target, ref HumanDescr
}
}
}

return false;
}
#endif
}
}
}
17 changes: 8 additions & 9 deletions Assets/VRM/UniVRM/Scripts/FirstPerson/VRMFirstPerson.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,18 +97,17 @@ private void Reset()

public void TraverseRenderers(VRMImporterContext context = null)
{
Renderers = Traverse(transform)
.Select(x => x.GetComponent<Renderer>())
.Where(x => x != null)
.Select(x => new RendererFirstPersonFlags
var rendererComponents = transform.GetComponentsInChildren<Renderer>();
foreach (var renderer in rendererComponents)
{
Renderers.Add(new RendererFirstPersonFlags
{
Renderer = x,
Renderer = renderer,
FirstPersonFlag = context == null
? FirstPersonFlag.Auto
: GetFirstPersonFlag(context, x)
})
.ToList()
;
: GetFirstPersonFlag(context, renderer)
});
}
}

static FirstPersonFlag GetFirstPersonFlag(VRMImporterContext context, Renderer r)
Expand Down
31 changes: 21 additions & 10 deletions Assets/VRM/UniVRM/Scripts/Format/glTF_VRM_Humanoid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public static VRMBone FromHumanBodyBone(this HumanBodyBones human)
{
return EnumUtil.TryParseOrDefault<VRMBone>(human.ToString(), VRMBone.unknown);
}

public static HumanBodyBones ToHumanBodyBone(this VRMBone bone)
{
#if UNITY_5_6_OR_NEWER
Expand All @@ -92,7 +93,8 @@ public static HumanBodyBones ToHumanBodyBone(this VRMBone bone)
[JsonSchema(Title = "vrm.humanoid.bone")]
public class glTF_VRM_HumanoidBone : JsonSerializableBase
{
[JsonSchema(Description = "Human bone name.", EnumValues = new object[] {
[JsonSchema(Description = "Human bone name.", EnumValues = new object[]
{
"hips",
"leftUpperLeg",
"rightUpperLeg",
Expand Down Expand Up @@ -148,8 +150,9 @@ public class glTF_VRM_HumanoidBone : JsonSerializableBase
"rightLittleIntermediate",
"rightLittleDistal",
"upperChest",
}, EnumSerializationType =EnumSerializationType.AsString)]
}, EnumSerializationType = EnumSerializationType.AsString)]
public string bone;

public VRMBone vrmBone
{
set
Expand Down Expand Up @@ -183,7 +186,7 @@ public VRMBone vrmBone

protected override void SerializeMembers(GLTFJsonFormatter f)
{
f.Key("bone"); f.Value((string)bone.ToString());
f.Key("bone"); f.Value((string) bone.ToString());
f.KeyValue(() => node);
f.KeyValue(() => useDefaultValues);
if (!useDefaultValues)
Expand Down Expand Up @@ -281,6 +284,7 @@ public void Apply(UniHumanoid.AvatarDescription desc, List<Transform> nodes)
};
humanBones.Add(found);
}

found.node = nodes.FindIndex(y => y.name == x.boneName);

found.useDefaultValues = x.useDefaultValues;
Expand All @@ -301,9 +305,13 @@ public UniHumanoid.AvatarDescription ToDescription(List<Transform> nodes)
description.armStretch = armStretch;
description.legStretch = legStretch;
description.hasTranslationDoF = hasTranslationDoF;
description.human = humanBones
.Where(x => x.node >= 0 && x.node < nodes.Count)
.Select(x => new UniHumanoid.BoneLimit

var boneLimits = new UniHumanoid.BoneLimit[humanBones.Count];
int index = 0;
foreach (var x in humanBones)
{
if (x.node < 0 || x.node >= nodes.Count) continue;
boneLimits[index] = new UniHumanoid.BoneLimit
{
boneName = nodes[x.node].name,
useDefaultValues = x.useDefaultValues,
Expand All @@ -312,10 +320,13 @@ public UniHumanoid.AvatarDescription ToDescription(List<Transform> nodes)
min = x.min,
max = x.max,
humanBone = x.vrmBone.ToHumanBodyBone(),
})
.Where(x => x.humanBone != HumanBodyBones.LastBone)
.ToArray();
};
index++;
}

description.human = boneLimits;

return description;
}
}
}
}
73 changes: 56 additions & 17 deletions Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Text;
#if UNITY_EDITOR
using UnityEditor;

#endif


Expand All @@ -15,7 +16,9 @@ namespace VRM
public static class VRMSpringUtility
{
#if UNITY_EDITOR

#region save

[MenuItem(VRMVersion.MENU + "/SaveSpringBoneToJSON", validate = true)]
static bool SaveSpringBoneToJSONIsEnable()
{
Expand All @@ -38,10 +41,10 @@ static bool SaveSpringBoneToJSONIsEnable()
static void SaveSpringBoneToJSON()
{
var path = EditorUtility.SaveFilePanel(
"Save spring to json",
null,
"VRMSpring.json",
"json");
"Save spring to json",
null,
"VRMSpring.json",
"json");
if (string.IsNullOrEmpty(path))
{
return;
Expand All @@ -54,14 +57,15 @@ static void SaveSpringBoneToJSON()
ExportSecondary(root, nodes,
spring.colliderGroups.Add,
spring.boneGroups.Add
);
);

File.WriteAllText(path, spring.ToJson());
}

#endregion

#region load

[MenuItem(VRMVersion.MENU + "/LoadSpringBoneFromJSON", true)]
static bool LoadSpringBoneFromJSONIsEnable()
{
Expand All @@ -84,9 +88,9 @@ static bool LoadSpringBoneFromJSONIsEnable()
static void LoadSpringBoneFromJSON()
{
var path = EditorUtility.OpenFilePanel(
"Load spring from json",
null,
"json");
"Load spring from json",
null,
"json");
if (string.IsNullOrEmpty(path))
{
return;
Expand All @@ -101,7 +105,9 @@ static void LoadSpringBoneFromJSON()

LoadSecondary(root, nodes, spring);
}

#endregion

#endif

public static void ExportSecondary(Transform root, List<Transform> nodes,
Expand All @@ -127,7 +133,6 @@ public static void ExportSecondary(Transform root, List<Transform> nodes,
offset = x.Offset,
radius = x.Radius,
};
}).ToList();

addSecondaryColliderGroup(colliderGroup);
Expand Down Expand Up @@ -166,10 +171,29 @@ public static void LoadSecondary(Transform root, List<Transform> nodes,
}

// clear components
var remove = root.Traverse()
.SelectMany(x => x.GetComponents<Component>())
.Where(x => x is VRMSpringBone || x is VRMSpringBoneColliderGroup)
.ToArray();
var vrmSpringBones = root.GetComponentsInChildren<VRMSpringBone>();
var vrmSpringBoneColliderGroup = root.GetComponentsInChildren<VRMSpringBoneColliderGroup>();

var length = (vrmSpringBones?.Length ?? 0) + (vrmSpringBoneColliderGroup?.Length ?? 0);
var remove = new Component[length];

var index = 0;
if (vrmSpringBones != null)
{
foreach (var vrmSpringBone in vrmSpringBones)
{
remove[index++] = vrmSpringBone;
}
}

if (vrmSpringBoneColliderGroup != null)
{
foreach (var vrmSpringBoneCollider in vrmSpringBoneColliderGroup)
{
remove[index++] = vrmSpringBoneCollider;
}
}

foreach (var x in remove)
{
if (Application.isPlaying)
Expand Down Expand Up @@ -207,24 +231,39 @@ public static void LoadSecondary(Transform root, List<Transform> nodes,
{
vrmBoneGroup.m_center = nodes[boneGroup.center];
}

vrmBoneGroup.m_comment = boneGroup.comment;
vrmBoneGroup.m_dragForce = boneGroup.dragForce;
vrmBoneGroup.m_gravityDir = boneGroup.gravityDir;
vrmBoneGroup.m_gravityPower = boneGroup.gravityPower;
vrmBoneGroup.m_hitRadius = boneGroup.hitRadius;
vrmBoneGroup.m_stiffnessForce = boneGroup.stiffiness;

if (boneGroup.colliderGroups != null && boneGroup.colliderGroups.Any())
{
vrmBoneGroup.ColliderGroups = boneGroup.colliderGroups.Select(x => colliders[x]).ToArray();
var colliderGroups = new VRMSpringBoneColliderGroup[boneGroup.colliderGroups.Length];
int i = 0;
foreach (var colliderGroup in boneGroup.colliderGroups)
{
colliderGroups[i] = colliders[colliderGroup];
}

vrmBoneGroup.ColliderGroups = colliderGroups;
}

var boneList = new List<Transform>();
foreach (var x in boneGroup.bones)
{
boneList.Add(nodes[x]);
}
vrmBoneGroup.RootBones = boneGroup.bones.Select(x => nodes[x]).ToList();

vrmBoneGroup.RootBones = boneList;
}
}
else
{
secondary.gameObject.AddComponent<VRMSpringBone>();
}
}

}
}
}

0 comments on commit ab4cf96

Please sign in to comment.