Optimize GC for identifier and beat time property source.
This commit is contained in:
@@ -17,6 +17,15 @@ namespace Cryville.Crtr {
|
|||||||
value = buf;
|
value = buf;
|
||||||
}
|
}
|
||||||
protected abstract void InternalGet();
|
protected abstract void InternalGet();
|
||||||
|
public abstract class FixedBuffer : PropSrc {
|
||||||
|
bool m_invalidated = true;
|
||||||
|
protected override bool Invalidated { get { return m_invalidated; } }
|
||||||
|
public override void Invalidate() { m_invalidated = true; }
|
||||||
|
public FixedBuffer(int type, int size) : base(type) { buf = new byte[size]; }
|
||||||
|
protected override void InternalGet() {
|
||||||
|
m_invalidated = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
public class Arbitrary : PropSrc {
|
public class Arbitrary : PropSrc {
|
||||||
readonly byte[] _value;
|
readonly byte[] _value;
|
||||||
public Arbitrary(int type, byte[] value) : base(type) {
|
public Arbitrary(int type, byte[] value) : base(type) {
|
||||||
@@ -26,25 +35,19 @@ namespace Cryville.Crtr {
|
|||||||
buf = _value;
|
buf = _value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class Boolean : PropSrc {
|
public class Boolean : FixedBuffer {
|
||||||
readonly Func<bool> _cb;
|
readonly Func<bool> _cb;
|
||||||
bool m_invalidated = true;
|
public Boolean(Func<bool> cb) : base(PdtInternalType.Number, 4) { _cb = cb; }
|
||||||
protected override bool Invalidated { get { return m_invalidated; } }
|
|
||||||
public override void Invalidate() { m_invalidated = true; }
|
|
||||||
public Boolean(Func<bool> cb) : base(PdtInternalType.Number) { _cb = cb; buf = new byte[4]; }
|
|
||||||
protected override void InternalGet() {
|
protected override void InternalGet() {
|
||||||
m_invalidated = false;
|
base.InternalGet();
|
||||||
buf[0] = _cb() ? (byte)1 : (byte)0;
|
buf[0] = _cb() ? (byte)1 : (byte)0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class Float : PropSrc {
|
public class Float : FixedBuffer {
|
||||||
readonly Func<float> _cb;
|
readonly Func<float> _cb;
|
||||||
bool m_invalidated = true;
|
public Float(Func<float> cb) : base(PdtInternalType.Number, 4) { _cb = cb; }
|
||||||
protected override bool Invalidated { get { return m_invalidated; } }
|
|
||||||
public override void Invalidate() { m_invalidated = true; }
|
|
||||||
public Float(Func<float> cb) : base(PdtInternalType.Number) { _cb = cb; buf = new byte[4]; }
|
|
||||||
protected override unsafe void InternalGet() {
|
protected override unsafe void InternalGet() {
|
||||||
m_invalidated = false;
|
base.InternalGet();
|
||||||
fixed (byte* _ptr = buf) {
|
fixed (byte* _ptr = buf) {
|
||||||
*(float*)_ptr = _cb();
|
*(float*)_ptr = _cb();
|
||||||
}
|
}
|
||||||
@@ -65,19 +68,22 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class Identifier : PropSrc {
|
public class Identifier : FixedBuffer {
|
||||||
readonly Func<int> _cb;
|
readonly Func<int> _cb;
|
||||||
public Identifier(Func<int> cb) : base(PdtInternalType.Undefined) { _cb = cb; }
|
public Identifier(Func<int> cb) : base(PdtInternalType.Undefined, 4) { _cb = cb; }
|
||||||
protected override void InternalGet() {
|
protected override unsafe void InternalGet() {
|
||||||
buf = BitConverter.GetBytes(_cb());
|
base.InternalGet();
|
||||||
|
fixed (byte* _ptr = buf) {
|
||||||
|
*(int*)_ptr = _cb();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class BeatTime : PropSrc {
|
public class BeatTime : FixedBuffer {
|
||||||
readonly Func<RBeatTime> _cb;
|
readonly Func<RBeatTime> _cb;
|
||||||
public BeatTime(Func<RBeatTime> cb) : base(PdtInternalType.Vector) { _cb = cb; }
|
public BeatTime(Func<RBeatTime> cb) : base(PdtInternalType.Vector, 4 * sizeof(int)) { _cb = cb; }
|
||||||
protected override unsafe void InternalGet() {
|
protected override unsafe void InternalGet() {
|
||||||
|
base.InternalGet();
|
||||||
var bt = _cb();
|
var bt = _cb();
|
||||||
buf = new byte[4 * sizeof(int)];
|
|
||||||
fixed (byte* _ptr = buf) {
|
fixed (byte* _ptr = buf) {
|
||||||
int* ptr = (int*)_ptr;
|
int* ptr = (int*)_ptr;
|
||||||
*ptr++ = bt.b;
|
*ptr++ = bt.b;
|
||||||
|
Reference in New Issue
Block a user