Allocation-safe asset reading
Try to not pre-allocate memory during asset reading
This commit is contained in:
@@ -39,7 +39,7 @@ namespace CubismLive2DExtractor
|
||||
for (int frameIndex = 1; frameIndex < streamedFrames.Count - 1; frameIndex++)
|
||||
{
|
||||
var frame = streamedFrames[frameIndex];
|
||||
for (int curveIndex = 0; curveIndex < frame.keyList.Length; curveIndex++)
|
||||
for (int curveIndex = 0; curveIndex < frame.keyList.Count; curveIndex++)
|
||||
{
|
||||
ReadStreamedData(iAnim, m_ClipBindingConstant, frame.time, frame.keyList[curveIndex]);
|
||||
}
|
||||
@@ -90,7 +90,7 @@ namespace CubismLive2DExtractor
|
||||
GetLive2dPath(binding, out var target, out var boneName);
|
||||
if (string.IsNullOrEmpty(boneName))
|
||||
{
|
||||
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}");
|
||||
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {m_ClipBindingConstant.genericBindings.FindIndex(x => x == binding)}");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ namespace CubismLive2DExtractor
|
||||
GetLive2dPath(binding, out var target, out var boneName);
|
||||
if (string.IsNullOrEmpty(boneName))
|
||||
{
|
||||
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}");
|
||||
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {m_ClipBindingConstant.genericBindings.FindIndex(x => x == binding)}");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace CubismLive2DExtractor
|
||||
// [Optional] Time of the overall Fade-Out for easing in seconds.
|
||||
FadeOutTime = fadeMotion.FadeOutTime,
|
||||
// The total number of curves.
|
||||
CurveCount = (int)fadeMotion.ParameterCurves.LongCount(x => x.m_Curve.Length > 0),
|
||||
CurveCount = (int)fadeMotion.ParameterCurves.LongCount(x => x.m_Curve.Count > 0),
|
||||
// [Optional] The total number of UserData.
|
||||
UserDataCount = 0
|
||||
};
|
||||
@@ -128,7 +128,7 @@ namespace CubismLive2DExtractor
|
||||
var actualCurveCount = 0;
|
||||
for (var i = 0; i < fadeMotion.ParameterCurves.Length; i++)
|
||||
{
|
||||
if (fadeMotion.ParameterCurves[i].m_Curve.Length == 0)
|
||||
if (fadeMotion.ParameterCurves[i].m_Curve.Count == 0)
|
||||
continue;
|
||||
|
||||
string target;
|
||||
@@ -174,7 +174,7 @@ namespace CubismLive2DExtractor
|
||||
fadeMotion.ParameterCurves[i].m_Curve[0].value
|
||||
}
|
||||
};
|
||||
for (var j = 1; j < fadeMotion.ParameterCurves[i].m_Curve.Length; j++)
|
||||
for (var j = 1; j < fadeMotion.ParameterCurves[i].m_Curve.Count; j++)
|
||||
{
|
||||
var curve = fadeMotion.ParameterCurves[i].m_Curve[j];
|
||||
var preCurve = fadeMotion.ParameterCurves[i].m_Curve[j - 1];
|
||||
|
||||
@@ -203,7 +203,7 @@ namespace AssetStudio
|
||||
|
||||
private ImportedFrame ConvertTransform(Transform trans)
|
||||
{
|
||||
var frame = new ImportedFrame(trans.m_Children.Length);
|
||||
var frame = new ImportedFrame(trans.m_Children.Count);
|
||||
transformDictionary.Add(trans, frame);
|
||||
trans.m_GameObject.TryGet(out var m_GameObject);
|
||||
frame.Name = m_GameObject.m_Name;
|
||||
@@ -286,7 +286,7 @@ namespace AssetStudio
|
||||
iMesh.hasColor = mesh.m_Colors?.Length > 0;
|
||||
|
||||
int firstFace = 0;
|
||||
for (int i = 0; i < mesh.m_SubMeshes.Length; i++)
|
||||
for (int i = 0; i < mesh.m_SubMeshes.Count; i++)
|
||||
{
|
||||
int numFaces = (int)mesh.m_SubMeshes[i].indexCount / 3;
|
||||
if (subHashSet.Count > 0 && !subHashSet.Contains(i))
|
||||
@@ -297,7 +297,7 @@ namespace AssetStudio
|
||||
var submesh = mesh.m_SubMeshes[i];
|
||||
var iSubmesh = new ImportedSubmesh();
|
||||
Material mat = null;
|
||||
if (i - firstSubMesh < meshR.m_Materials.Length)
|
||||
if (i - firstSubMesh < meshR.m_Materials.Count)
|
||||
{
|
||||
if (meshR.m_Materials[i - firstSubMesh].TryGet(out var m_Material))
|
||||
{
|
||||
@@ -410,16 +410,16 @@ namespace AssetStudio
|
||||
* 2 - m_BoneNameHashes
|
||||
*/
|
||||
var boneType = 0;
|
||||
if (sMesh.m_Bones.Length > 0)
|
||||
if (sMesh.m_Bones.Count > 0)
|
||||
{
|
||||
if (sMesh.m_Bones.Length == mesh.m_BindPose.Length)
|
||||
if (sMesh.m_Bones.Count == mesh.m_BindPose.Length)
|
||||
{
|
||||
var verifiedBoneCount = sMesh.m_Bones.Count(x => x.TryGet(out _));
|
||||
if (verifiedBoneCount > 0)
|
||||
{
|
||||
boneType = 1;
|
||||
}
|
||||
if (verifiedBoneCount != sMesh.m_Bones.Length)
|
||||
if (verifiedBoneCount != sMesh.m_Bones.Count)
|
||||
{
|
||||
//尝试使用m_BoneNameHashes 4.3 and up
|
||||
if (mesh.m_BindPose.Length > 0 && (mesh.m_BindPose.Length == mesh.m_BoneNameHashes?.Length))
|
||||
@@ -449,7 +449,7 @@ namespace AssetStudio
|
||||
|
||||
if (boneType == 1)
|
||||
{
|
||||
var boneCount = sMesh.m_Bones.Length;
|
||||
var boneCount = sMesh.m_Bones.Count;
|
||||
iMesh.BoneList = new List<ImportedBone>(boneCount);
|
||||
for (int i = 0; i < boneCount; i++)
|
||||
{
|
||||
@@ -480,13 +480,13 @@ namespace AssetStudio
|
||||
}
|
||||
|
||||
//Morphs
|
||||
if (mesh.m_Shapes?.channels?.Length > 0)
|
||||
if (mesh.m_Shapes?.channels?.Count > 0)
|
||||
{
|
||||
var morph = new ImportedMorph();
|
||||
MorphList.Add(morph);
|
||||
morph.Path = iMesh.Path;
|
||||
morph.Channels = new List<ImportedMorphChannel>(mesh.m_Shapes.channels.Length);
|
||||
for (int i = 0; i < mesh.m_Shapes.channels.Length; i++)
|
||||
morph.Channels = new List<ImportedMorphChannel>(mesh.m_Shapes.channels.Count);
|
||||
for (var i = 0; i < mesh.m_Shapes.channels.Count; i++)
|
||||
{
|
||||
var channel = new ImportedMorphChannel();
|
||||
morph.Channels.Add(channel);
|
||||
@@ -501,7 +501,7 @@ namespace AssetStudio
|
||||
channel.Name = shapeChannel.name.Split('.').Last();
|
||||
channel.KeyframeList = new List<ImportedMorphKeyframe>(shapeChannel.frameCount);
|
||||
var frameEnd = shapeChannel.frameIndex + shapeChannel.frameCount;
|
||||
for (int frameIdx = shapeChannel.frameIndex; frameIdx < frameEnd; frameIdx++)
|
||||
for (var frameIdx = shapeChannel.frameIndex; frameIdx < frameEnd; frameIdx++)
|
||||
{
|
||||
var keyframe = new ImportedMorphKeyframe();
|
||||
channel.KeyframeList.Add(keyframe);
|
||||
@@ -890,7 +890,7 @@ namespace AssetStudio
|
||||
{
|
||||
var frame = streamedFrames[frameIndex];
|
||||
var streamedValues = frame.keyList.Select(x => x.value).ToArray();
|
||||
for (var curveIndex = 0; curveIndex < frame.keyList.Length;)
|
||||
for (var curveIndex = 0; curveIndex < frame.keyList.Count;)
|
||||
{
|
||||
ReadCurveData(iAnim, m_ClipBindingConstant, frame.keyList[curveIndex].index, frame.time, streamedValues, 0, ref curveIndex);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using K4os.Compression.LZ4;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -138,42 +139,42 @@ namespace AssetStudio
|
||||
{
|
||||
sb.Append(ConvertSerializedShaderState(m_Passe.m_State));
|
||||
|
||||
if (m_Passe.progVertex.m_SubPrograms.Length > 0)
|
||||
if (m_Passe.progVertex.m_SubPrograms.Count > 0)
|
||||
{
|
||||
sb.Append("Program \"vp\" {\n");
|
||||
sb.Append(ConvertSerializedSubPrograms(m_Passe.progVertex.m_SubPrograms, platforms, shaderPrograms));
|
||||
sb.Append("}\n");
|
||||
}
|
||||
|
||||
if (m_Passe.progFragment.m_SubPrograms.Length > 0)
|
||||
if (m_Passe.progFragment.m_SubPrograms.Count > 0)
|
||||
{
|
||||
sb.Append("Program \"fp\" {\n");
|
||||
sb.Append(ConvertSerializedSubPrograms(m_Passe.progFragment.m_SubPrograms, platforms, shaderPrograms));
|
||||
sb.Append("}\n");
|
||||
}
|
||||
|
||||
if (m_Passe.progGeometry.m_SubPrograms.Length > 0)
|
||||
if (m_Passe.progGeometry.m_SubPrograms.Count > 0)
|
||||
{
|
||||
sb.Append("Program \"gp\" {\n");
|
||||
sb.Append(ConvertSerializedSubPrograms(m_Passe.progGeometry.m_SubPrograms, platforms, shaderPrograms));
|
||||
sb.Append("}\n");
|
||||
}
|
||||
|
||||
if (m_Passe.progHull.m_SubPrograms.Length > 0)
|
||||
if (m_Passe.progHull.m_SubPrograms.Count > 0)
|
||||
{
|
||||
sb.Append("Program \"hp\" {\n");
|
||||
sb.Append(ConvertSerializedSubPrograms(m_Passe.progHull.m_SubPrograms, platforms, shaderPrograms));
|
||||
sb.Append("}\n");
|
||||
}
|
||||
|
||||
if (m_Passe.progDomain.m_SubPrograms.Length > 0)
|
||||
if (m_Passe.progDomain.m_SubPrograms.Count > 0)
|
||||
{
|
||||
sb.Append("Program \"dp\" {\n");
|
||||
sb.Append(ConvertSerializedSubPrograms(m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms));
|
||||
sb.Append("}\n");
|
||||
}
|
||||
|
||||
if (m_Passe.progRayTracing?.m_SubPrograms.Length > 0)
|
||||
if (m_Passe.progRayTracing?.m_SubPrograms.Count > 0)
|
||||
{
|
||||
sb.Append("Program \"rtp\" {\n");
|
||||
sb.Append(ConvertSerializedSubPrograms(m_Passe.progRayTracing.m_SubPrograms, platforms, shaderPrograms));
|
||||
@@ -185,7 +186,7 @@ namespace AssetStudio
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
private static string ConvertSerializedSubPrograms(SerializedSubProgram[] m_SubPrograms, ShaderCompilerPlatform[] platforms, ShaderProgram[] shaderPrograms)
|
||||
private static string ConvertSerializedSubPrograms(List<SerializedSubProgram> m_SubPrograms, ShaderCompilerPlatform[] platforms, ShaderProgram[] shaderPrograms)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
var groups = m_SubPrograms.GroupBy(x => x.m_BlobIndex);
|
||||
@@ -638,7 +639,7 @@ namespace AssetStudio
|
||||
private static string ConvertSerializedTagMap(SerializedTagMap m_Tags, int intent)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
if (m_Tags.tags.Length > 0)
|
||||
if (m_Tags.tags.Count > 0)
|
||||
{
|
||||
sb.Append(new string(' ', intent));
|
||||
sb.Append("Tags { ");
|
||||
|
||||
Reference in New Issue
Block a user