您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
60 行
1.2 KiB
60 行
1.2 KiB
public class TickStateDenseBuffer<T> where T : struct
|
|
{
|
|
public TickStateDenseBuffer(int capasity)
|
|
{
|
|
m_Elements = new T[capasity];
|
|
}
|
|
|
|
public int LastTick()
|
|
{
|
|
return m_Size > 0 ? m_Tick : -1;
|
|
}
|
|
|
|
public int FirstTick()
|
|
{
|
|
return m_Size > 0 ? m_Tick - m_Size + 1 : -1;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
m_Size = 0;
|
|
}
|
|
|
|
public bool TryGetValue(int tick, ref T result)
|
|
{
|
|
if (IsValidTick(tick))
|
|
{
|
|
result = m_Elements[tick % m_Elements.Length];
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public void Add(ref T value, int tick)
|
|
{
|
|
m_Elements[tick % m_Elements.Length] = value;
|
|
|
|
// Reset the buffer if we receive non consecutive tick
|
|
if (tick - m_Tick != 1)
|
|
m_Size = 1;
|
|
else if(m_Size < m_Elements.Length)
|
|
++m_Size;
|
|
|
|
m_Tick = tick;
|
|
}
|
|
|
|
public void Set(ref T value, int tick)
|
|
{
|
|
m_Elements[tick % m_Elements.Length] = value;
|
|
}
|
|
|
|
public bool IsValidTick(int tick)
|
|
{
|
|
return tick <= m_Tick && tick > m_Tick - m_Size;
|
|
}
|
|
|
|
T[] m_Elements;
|
|
int m_Tick;
|
|
int m_Size;
|
|
}
|