Optimize GC for motion string parsing.
This commit is contained in:
@@ -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");
|
||||
|
Reference in New Issue
Block a user