此方法是目前我想到的极限效率统计方式了。
使用循环队列来做这个事情,不然每次统计帧数少了 跳得厉害多了影响结果
public class AvgFPSCounter
{int MaxFrameInCalculation = 200;
int[] UsingTimeInFrame = null;
int TotalTime = 0;
int CalCount = 0;
bool HasFullList = false;
volatile bool IsUpdateThread = false;
public int FPS = 0;
public void InitFPS()
{
UsingTimeInFrame = new int[MaxFrameInCalculation];
CalCount = 0;
HasFullList = false;
}
public void InitFPS(int NewMaxFrameInCalculation)
{
MaxFrameInCalculation = NewMaxFrameInCalculation;
InitFPS();
}
public void UpdateFPS(int FrameUsingMSTime)
{
if (HasFullList)
{
TotalTime -= UsingTimeInFrame[CalCount];
}
UsingTimeInFrame[CalCount] = FrameUsingMSTime;
TotalTime += FrameUsingMSTime;
++CalCount;
HasFullList |= CalCount >= MaxFrameInCalculation;
CalCount %= MaxFrameInCalculation;
if (TotalTime == 0)
return;
if (HasFullList)
{
FPS = MaxFrameInCalculation * 1000 / TotalTime;
}
else
{
FPS = CalCount * 1000 / TotalTime;
}
}
}