您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
169 行
3.8 KiB
169 行
3.8 KiB
using UnityEngine;
|
|
|
|
|
|
public class TickStateSparseBuffer<T>
|
|
{
|
|
public TickStateSparseBuffer(int size)
|
|
{
|
|
m_Elements = new T[size];
|
|
m_Ticks = new int[size];
|
|
}
|
|
|
|
public int Count { get { return m_Count; } }
|
|
public int Capacity { get { return m_Ticks.Length; } }
|
|
|
|
public T this[int index]
|
|
{
|
|
get
|
|
{
|
|
Debug.Assert(index >= 0 && index < m_Count);
|
|
return m_Elements[index];
|
|
}
|
|
}
|
|
|
|
public int FirstTick()
|
|
{
|
|
return m_Count > 0 ? m_Ticks[m_First] : -1;
|
|
}
|
|
|
|
public int LastTick()
|
|
{
|
|
return m_Count > 0 ? m_Ticks[(m_First + m_Count - 1) % m_Ticks.Length] : -1;
|
|
}
|
|
|
|
public T First()
|
|
{
|
|
Debug.Assert(m_Count > 0);
|
|
return m_Elements[m_First];
|
|
}
|
|
|
|
public T Last()
|
|
{
|
|
Debug.Assert(m_Count > 0);
|
|
return m_Elements[(m_First + m_Count - 1) % m_Ticks.Length];
|
|
}
|
|
|
|
public bool TryGetValue(int tick, out T result)
|
|
{
|
|
var index = m_First;
|
|
for (int i = 0; i < m_Count; ++i, ++index)
|
|
{
|
|
if (index == m_Ticks.Length)
|
|
index = 0;
|
|
|
|
if (m_Ticks[index] == tick)
|
|
{
|
|
result = m_Elements[index];
|
|
return true;
|
|
}
|
|
}
|
|
|
|
result = default(T);
|
|
return false;
|
|
}
|
|
|
|
public bool GetStates(int tick, float fraction, ref int lowIndex, ref int highIndex, ref float outputFraction)
|
|
{
|
|
lowIndex = GetValidIndexLower(tick);
|
|
highIndex = GetValidIndexHigher(tick + 1);
|
|
|
|
if (lowIndex == -1 || highIndex == -1)
|
|
return false;
|
|
|
|
int lowTick = GetTickByIndex(lowIndex);
|
|
int highTick = GetTickByIndex(highIndex);
|
|
|
|
float total = (float)(highTick - lowTick);
|
|
float relativeTime = tick - lowTick + fraction;
|
|
|
|
outputFraction = relativeTime / total;
|
|
|
|
return true;
|
|
}
|
|
|
|
int GetValidIndexLower(int tick)
|
|
{
|
|
var index = m_First;
|
|
|
|
int bestResultIndex = -1;
|
|
for (int i = 0; i < m_Count; ++i, ++index)
|
|
{
|
|
if (index == m_Ticks.Length)
|
|
index = 0;
|
|
|
|
if (m_Ticks[index] == tick)
|
|
{
|
|
bestResultIndex = index;
|
|
break;
|
|
}
|
|
|
|
if (m_Ticks[index] < tick)
|
|
{
|
|
bestResultIndex = index;
|
|
}
|
|
}
|
|
|
|
return bestResultIndex;
|
|
}
|
|
|
|
int GetValidIndexHigher(int tick)
|
|
{
|
|
var index = m_First;
|
|
|
|
int bestResultIndex = -1;
|
|
for (int i = 0; i < m_Count; ++i, ++index)
|
|
{
|
|
if (index == m_Ticks.Length)
|
|
index = 0;
|
|
|
|
if (m_Ticks[index] == tick || m_Ticks[index] > tick)
|
|
{
|
|
bestResultIndex = index;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return bestResultIndex;
|
|
}
|
|
|
|
public int GetTickByIndex(int index)
|
|
{
|
|
Debug.Assert(index >= 0 && index < m_Count);
|
|
return m_Ticks[index];
|
|
}
|
|
|
|
public void Add(int tick, T element)
|
|
{
|
|
var last = LastTick();
|
|
if (last != -1 && last >= tick)
|
|
throw new System.InvalidOperationException(string.Format("Ticks must be increasing when adding (last = {0}, trying to add {1})", last, tick));
|
|
|
|
var index = (m_First + m_Count) % m_Ticks.Length;
|
|
|
|
m_Ticks[index] = tick;
|
|
m_Elements[index] = element;
|
|
|
|
if (m_Count < m_Ticks.Length)
|
|
m_Count++;
|
|
else
|
|
m_First = (m_First + 1) % m_Ticks.Length;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
m_First = 0;
|
|
m_Count = 0;
|
|
|
|
for (int i = 0; i < m_Ticks.Length; ++i)
|
|
m_Elements[i] = default(T);
|
|
|
|
for (int i = 0; i < m_Ticks.Length; ++i)
|
|
m_Ticks[i] = 0;
|
|
}
|
|
|
|
int m_First;
|
|
int m_Count;
|
|
|
|
T[] m_Elements;
|
|
int[] m_Ticks;
|
|
}
|