Optimize GC for vector property source.

This commit is contained in:
2023-02-21 18:27:29 +08:00
parent 6c983cc2cb
commit a3c5392caa
3 changed files with 41 additions and 46 deletions

View File

@@ -320,7 +320,7 @@ namespace Cryville.Crtr {
else {
AbsoluteValue = Vector.Construct(registry.Type, m.Groups[11].Value);
}
SubmitPropSrc("value", VectorSrc.Construct(() => {
SubmitPropSrc("value", new VectorSrc(() => {
if (RelativeNode != null) return RelativeNode.Value;
else return AbsoluteValue;
}));

View File

@@ -361,7 +361,7 @@ namespace Cryville.Crtr {
public abstract float DelerpWith(Vector start, Vector value);
public abstract bool IsZero();
public override abstract string ToString();
public abstract float[] ToArray();
public abstract unsafe void ToArray(float* arr);
public Vector Clone() {
return (Vector)MemberwiseClone();
@@ -442,8 +442,8 @@ namespace Cryville.Crtr {
return Value.ToString(CultureInfo.InvariantCulture);
}
public override float[] ToArray() {
return new float[] { Value };
public override unsafe void ToArray(float* arr) {
arr[0] = Value;
}
}
@@ -504,8 +504,8 @@ namespace Cryville.Crtr {
return Value.ToString(CultureInfo.InvariantCulture);
}
public override float[] ToArray() {
return new float[] { Value };
public override unsafe void ToArray(float* arr) {
arr[0] = Value;
}
}
@@ -566,8 +566,8 @@ namespace Cryville.Crtr {
return Value.ToString(CultureInfo.InvariantCulture);
}
public override float[] ToArray() {
return new float[] { Value };
public override unsafe void ToArray(float* arr) {
arr[0] = Value;
}
}
@@ -669,8 +669,9 @@ namespace Cryville.Crtr {
return ToString(w, h);
}
public override float[] ToArray() {
return new float[] { w.Value, h.Value };
public override unsafe void ToArray(float* arr) {
arr[0] = w.Value;
arr[1] = h.Value;
}
}
@@ -764,8 +765,10 @@ namespace Cryville.Crtr {
);
}
public override float[] ToArray() {
return new float[] { x.Value, y.Value, z.Value };
public override unsafe void ToArray(float* arr) {
arr[0] = x.Value;
arr[1] = y.Value;
arr[2] = z.Value;
}
}
@@ -845,8 +848,11 @@ namespace Cryville.Crtr {
return VecPtComp.ToString(xw, xh) + "," + VecPtComp.ToString(yw, yh);
}
public override float[] ToArray() {
return new float[] { xw.Value, xh.Value, yw.Value, yh.Value };
public override unsafe void ToArray(float* arr) {
arr[0] = xw.Value;
arr[1] = xh.Value;
arr[2] = yw.Value;
arr[3] = yh.Value;
}
}
@@ -936,40 +942,25 @@ namespace Cryville.Crtr {
return VecPtComp.ToString(xw, xh) + "," + VecPtComp.ToString(yw, yh) + "," + (z != null ? z.Value.ToString(CultureInfo.InvariantCulture) : "");
}
public override float[] ToArray() {
return new float[] { xw.Value, xh.Value, yw.Value, yh.Value, z.Value };
public override unsafe void ToArray(float* arr) {
arr[0] = xw.Value;
arr[1] = xh.Value;
arr[2] = yw.Value;
arr[3] = yh.Value;
arr[4] = z.Value;
}
}
public abstract class VectorSrc : PropSrc {
public class VectorSrc : PropSrc.FixedBuffer {
protected readonly Func<Vector> _cb;
public VectorSrc(Func<Vector> cb, int type) : base(type) { _cb = cb; }
public static VectorSrc Construct(Func<Vector> cb) {
if (cb().Dimension == 1) return new INumber(cb);
else return new IVector(cb);
}
class INumber : VectorSrc {
public INumber(Func<Vector> cb) : base(cb, PdtInternalType.Number) { }
protected override unsafe void InternalGet() {
var arr = _cb().ToArray();
buf = new byte[sizeof(float)];
fixed (byte* ptr = buf) {
*(float*)ptr = arr[0];
}
}
}
class IVector : VectorSrc {
public IVector(Func<Vector> cb) : base(cb, PdtInternalType.Vector) { }
protected override unsafe void InternalGet() {
var arr = _cb().ToArray();
buf = new byte[sizeof(float) * arr.Length + sizeof(int)];
fixed (byte* rptr = buf) {
var ptr = (float*)rptr;
for (int i = 0; i < arr.Length; i++, ptr++) {
*ptr = arr[i];
}
*(int*)ptr = PdtInternalType.Number;
}
public VectorSrc(Func<Vector> cb) : base(PdtInternalType.Vector, 8 * sizeof(float) + sizeof(int)) { _cb = cb; }
protected override unsafe void InternalGet() {
var v = _cb();
if (v.Dimension > 8) throw new NotSupportedException("Vector dimension too large");
fixed (byte* rptr = buf) {
var ptr = (float*)rptr;
v.ToArray(ptr);
*(int*)(ptr + v.Dimension) = PdtInternalType.Number;
}
}
}

View File

@@ -13,6 +13,8 @@ namespace Cryville.Crtr {
static readonly byte[] _nullbuf = new byte[0];
readonly byte[] _numbuf = new byte[4];
readonly PropSrc _vecsrc;
Vector _vec;
static readonly int _var_w = IdentifierManager.SharedInstance.Request("w");
static readonly int _var_h = IdentifierManager.SharedInstance.Request("h");
static readonly int _var_current_time = IdentifierManager.SharedInstance.Request("current_time");
@@ -32,8 +34,9 @@ namespace Cryville.Crtr {
prop.Get(out type, out value);
}
else if (ContextState != null && ChartPlayer.motionRegistry.ContainsKey(id)) {
var vec = ContextState.GetRawValue(id);
VectorSrc.Construct(() => vec).Get(out type, out value);
_vec = ContextState.GetRawValue(id);
_vecsrc.Invalidate();
_vecsrc.Get(out type, out value);
}
else if (ContextState != null && ContextState.Handler.PropSrcs.TryGetValue(name, out prop)) {
prop.Get(out type, out value);
@@ -140,6 +143,7 @@ namespace Cryville.Crtr {
public PdtEvaluator() {
ContextCascadeBlocks.Push(0);
for (int i = 0; i < ContextCascade.Length; i++) ContextCascade[i] = new Dictionary<int, PropSrc>();
_vecsrc = new VectorSrc(() => _vec);
_ctxops.Add(IdentifierManager.SharedInstance.Request("screen_edge"), new func_screen_edge(() => ContextTransform));
_ctxops.Add(IdentifierManager.SharedInstance.Request("int"), new func_int(() => ContextSelfValue));