#include "TimeComputer.h"
#include <OS.h>
TimeComputer::TimeComputer()
:
fRealTime(0),
fPerformanceTime(0),
fDrift(1),
fFrameRate(1000000),
fUsecsPerFrame(1),
fPerformanceTimeBase(0),
fFrameBase(0),
fResetTimeBase(true),
fFirstEntry(0),
fLastEntry(0)
{
}
void
TimeComputer::Init(float frameRate, bigtime_t realBaseTime)
{
fRealTime = realBaseTime;
fPerformanceTime = 0;
fDrift = 1;
SetFrameRate(frameRate);
}
void
TimeComputer::SetFrameRate(float frameRate)
{
if (frameRate == fFrameRate)
return;
fFrameRate = frameRate;
fUsecsPerFrame = (double)1000000 / fFrameRate;
fResetTimeBase = true;
fFirstEntry = 0;
fLastEntry = 0;
}
void
TimeComputer::AddTimeStamp(bigtime_t realTime, uint64 frames)
{
bigtime_t estimatedPerformanceTime = fPerformanceTime
+ bigtime_t((realTime - fRealTime) * fDrift);
fRealTime = realTime;
if (fResetTimeBase) {
fPerformanceTime = estimatedPerformanceTime;
fPerformanceTimeBase = estimatedPerformanceTime;
fFrameBase = frames;
fResetTimeBase = false;
_AddEntry(fRealTime, fPerformanceTime);
fFirstEntry = fLastEntry;
return;
}
bigtime_t performanceTime = fPerformanceTimeBase
+ bigtime_t((frames - fFrameBase) * fUsecsPerFrame);
_AddEntry(realTime, performanceTime);
fPerformanceTime = (performanceTime + estimatedPerformanceTime) / 2;
Entry& entry = fEntries[fFirstEntry];
fDrift = double(fPerformanceTime - entry.performanceTime)
/ double(fRealTime - entry.realTime);
}
void
TimeComputer::_AddEntry(bigtime_t realTime, bigtime_t performanceTime)
{
fLastEntry = (fLastEntry + 1) % kEntryCount;
Entry& entry = fEntries[fLastEntry];
entry.realTime = realTime;
entry.performanceTime = performanceTime;
if (fLastEntry == fFirstEntry)
fFirstEntry = (fFirstEntry + 1) % kEntryCount;
}