Optimize GC for frame calculation.
This commit is contained in:
@@ -54,16 +54,13 @@ namespace Cryville.Common.Math {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a <see cref="System.Single" /> column vector and fills it with polynomial coefficients.
|
/// Fills a <see cref="System.Single" /> column vector with polynomial coefficients.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="size">The size of the column vector.</param>
|
/// <param name="vec">The column vector.</param>
|
||||||
/// <param name="num">The base number.</param>
|
/// <param name="num">The base number.</param>
|
||||||
/// <returns>A <see cref="System.Single" /> column vector filled with polynomial coefficients.</returns>
|
public static void FillWithPolynomialCoefficients(ColumnVector<float> vec, float num) {
|
||||||
public static ColumnVector<float> WithPolynomialCoefficients(int size, float num) {
|
for (var i = 0; i < vec.Size; i++)
|
||||||
var m = new ColumnVector<float>(size);
|
vec[i] = (float)System.Math.Pow(num, i);
|
||||||
for (var i = 0; i < size; i++)
|
|
||||||
m[i] = (float)System.Math.Pow(num, i);
|
|
||||||
return m;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ namespace Cryville.Common.Math {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The vector type.</typeparam>
|
/// <typeparam name="T">The vector type.</typeparam>
|
||||||
/// <param name="v">The column vector.</param>
|
/// <param name="v">The column vector.</param>
|
||||||
|
/// <param name="result">The result column vector.</param>
|
||||||
/// <param name="o">The column operator.</param>
|
/// <param name="o">The column operator.</param>
|
||||||
/// <returns>The column vector eliminated.</returns>
|
public void Eliminate<T>(ColumnVector<T> v, ColumnVector<T> result, IVectorOperator<T> o) {
|
||||||
public ColumnVector<T> Eliminate<T>(ColumnVector<T> v, IVectorOperator<T> o) {
|
|
||||||
int s = Size;
|
int s = Size;
|
||||||
Array.Copy(content, buffer, Size * Size);
|
Array.Copy(content, buffer, Size * Size);
|
||||||
for (int i = 0; i < s; i++) refl[i] = i;
|
for (int i = 0; i < s; i++) refl[i] = i;
|
||||||
@@ -66,14 +66,12 @@ namespace Cryville.Common.Math {
|
|||||||
v[or1] = o.Add(v[or1], o.ScalarMultiply(-sf1, v[or]));
|
v[or1] = o.Add(v[or1], o.ScalarMultiply(-sf1, v[or]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ColumnVector<T> res = new ColumnVector<T>(s);
|
|
||||||
for (int r2 = s - 1; r2 >= 0; r2--) {
|
for (int r2 = s - 1; r2 >= 0; r2--) {
|
||||||
var v2 = v[refl[r2]];
|
var v2 = v[refl[r2]];
|
||||||
for (int c2 = r2 + 1; c2 < s; c2++)
|
for (int c2 = r2 + 1; c2 < s; c2++)
|
||||||
v2 = o.Add(v2, o.ScalarMultiply(-buffer[refl[r2], c2], res[refl[c2]]));
|
v2 = o.Add(v2, o.ScalarMultiply(-buffer[refl[r2], c2], result[refl[c2]]));
|
||||||
res[refl[r2]] = v2;
|
result[refl[r2]] = v2;
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a square matrix and fills it with polynomial coefficients.
|
/// Creates a square matrix and fills it with polynomial coefficients.
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ namespace Cryville.Crtr {
|
|||||||
|
|
||||||
SquareMatrix matFrame;
|
SquareMatrix matFrame;
|
||||||
ContainerState[] tracks;
|
ContainerState[] tracks;
|
||||||
|
public int TrackCount { get { return tracks.Length; } }
|
||||||
|
|
||||||
public GroupHandler(Chart.Group tg, ChartHandler ch) : base() {
|
public GroupHandler(Chart.Group tg, ChartHandler ch) : base() {
|
||||||
this.ch = ch;
|
this.ch = ch;
|
||||||
@@ -25,14 +26,17 @@ namespace Cryville.Crtr {
|
|||||||
select c.Value
|
select c.Value
|
||||||
).ToArray();
|
).ToArray();
|
||||||
matFrame = SquareMatrix.WithPolynomialCoefficients(tracks.Length);
|
matFrame = SquareMatrix.WithPolynomialCoefficients(tracks.Length);
|
||||||
frame = new ColumnVector<Vector3>(tracks.Length);
|
frame1 = new ColumnVector<Vector3>(tracks.Length);
|
||||||
|
frame2 = new ColumnVector<Vector3>(tracks.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnVector<Vector3> frame;
|
ColumnVector<Vector3> frame1;
|
||||||
|
ColumnVector<Vector3> frame2;
|
||||||
public ColumnVector<Vector3> GetCurrentFrame(Func<ContainerState, Vector3> func) {
|
public ColumnVector<Vector3> GetCurrentFrame(Func<ContainerState, Vector3> func) {
|
||||||
for (int i = 0; i < tracks.Length; i++)
|
for (int i = 0; i < tracks.Length; i++)
|
||||||
frame[i] = func(tracks[i]);
|
frame1[i] = func(tracks[i]);
|
||||||
return matFrame.Eliminate(frame, Vector3Operator.Instance);
|
matFrame.Eliminate(frame1, frame2, Vector3Operator.Instance);
|
||||||
|
return frame2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ namespace Cryville.Crtr {
|
|||||||
|
|
||||||
public override void PreInit() {
|
public override void PreInit() {
|
||||||
base.PreInit();
|
base.PreInit();
|
||||||
|
coeffs = new ColumnVector<float>(gh.TrackCount);
|
||||||
foreach (var j in Event.judges) {
|
foreach (var j in Event.judges) {
|
||||||
judges.Add(j, new JudgeState(this, j.Id.Key));
|
judges.Add(j, new JudgeState(this, j.Id.Key));
|
||||||
}
|
}
|
||||||
@@ -132,6 +133,7 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
readonly List<Vector3> ctrl = new List<Vector3>(2);
|
readonly List<Vector3> ctrl = new List<Vector3>(2);
|
||||||
|
ColumnVector<float> coeffs;
|
||||||
Vector3 GetFrame(ContainerState state, float track, Func<ContainerState, Vector3> func) {
|
Vector3 GetFrame(ContainerState state, float track, Func<ContainerState, Vector3> func) {
|
||||||
// TODO
|
// TODO
|
||||||
int id = Mathf.FloorToInt(track);
|
int id = Mathf.FloorToInt(track);
|
||||||
@@ -160,12 +162,8 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
if (ctrl.Count == 0) {
|
if (ctrl.Count == 0) {
|
||||||
var frame = gh.GetCurrentFrame(func);
|
var frame = gh.GetCurrentFrame(func);
|
||||||
return frame.Dot(
|
ColumnVector<float>.FillWithPolynomialCoefficients(coeffs, track);
|
||||||
ColumnVector<float>.WithPolynomialCoefficients(
|
return frame.Dot(coeffs, Vector3Operator.Instance);
|
||||||
frame.Size, track
|
|
||||||
),
|
|
||||||
Vector3Operator.Instance
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else if (ctrl.Count == 1) {
|
else if (ctrl.Count == 1) {
|
||||||
return nt * (nt * p1 + t * (ctrl[0] + p1)) + t * t * p2;
|
return nt * (nt * p1 + t * (ctrl[0] + p1)) + t * t * p2;
|
||||||
|
|||||||
Reference in New Issue
Block a user