Optimize GC for motion string parsing.

This commit is contained in:
2023-04-18 10:10:11 +08:00
parent a7be55f2b0
commit f664708165

View File

@@ -294,6 +294,10 @@ namespace Cryville.Crtr {
}
public class Motion : ChartEvent {
static readonly PdtFragmentInterpreter _itor = new PdtFragmentInterpreter();
static readonly PropOp _vecop = new VectorOp(v => _vecbuf = v);
static float[] _vecbuf;
#pragma warning disable IDE1006
[JsonRequired]
public string motion {
@@ -301,8 +305,6 @@ namespace Cryville.Crtr {
set { LoadFromString(value); }
}
#pragma warning restore IDE1006
static readonly PdtFragmentInterpreter _itor = new PdtFragmentInterpreter();
private void LoadFromString(string s) {
if (Node != null)
throw new InvalidOperationException("The motion property can only be set at initialization");
@@ -323,19 +325,16 @@ namespace Cryville.Crtr {
var exp = _itor.GetExp();
switch (c) {
case '@':
ChartPlayer.etor.Evaluate(new VectorOp(v => {
Node.Time = new Vec1(v);
}), exp);
ChartPlayer.etor.Evaluate(_vecop, exp);
Node.Time = new Vec1(_vecbuf);
break;
case '~':
ChartPlayer.etor.Evaluate(new VectorOp(v => {
Node.EndTime = new Vec1(v);
}), exp);
ChartPlayer.etor.Evaluate(_vecop, exp);
Node.EndTime = new Vec1(_vecbuf);
break;
case ':':
ChartPlayer.etor.Evaluate(new VectorOp(v => {
Node.Value = Vector.Construct(ChartPlayer.motionRegistry[Name].Type, v);
}), exp);
ChartPlayer.etor.Evaluate(_vecop, exp);
Node.Value = Vector.Construct(ChartPlayer.motionRegistry[Name].Type, _vecbuf);
break;
default:
throw new ArgumentException("Invalid motion string format");