V2 working
This commit is contained in:
45
apps/RenderCadenceCompositor/render/RenderCadenceClock.cpp
Normal file
45
apps/RenderCadenceCompositor/render/RenderCadenceClock.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
#include "RenderCadenceClock.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
RenderCadenceClock::RenderCadenceClock(double frameDurationMilliseconds)
|
||||
{
|
||||
mFrameDuration = std::chrono::duration_cast<Duration>(std::chrono::duration<double, std::milli>(frameDurationMilliseconds));
|
||||
if (mFrameDuration <= Duration::zero())
|
||||
mFrameDuration = std::chrono::milliseconds(16);
|
||||
Reset();
|
||||
}
|
||||
|
||||
void RenderCadenceClock::Reset(TimePoint now)
|
||||
{
|
||||
mNextRenderTime = now;
|
||||
mOverrunCount = 0;
|
||||
mSkippedFrameCount = 0;
|
||||
}
|
||||
|
||||
RenderCadenceClock::Tick RenderCadenceClock::Poll(TimePoint now)
|
||||
{
|
||||
Tick tick;
|
||||
if (now < mNextRenderTime)
|
||||
{
|
||||
tick.sleepFor = std::min(Duration(std::chrono::milliseconds(1)), mNextRenderTime - now);
|
||||
return tick;
|
||||
}
|
||||
|
||||
tick.due = true;
|
||||
const Duration lateBy = now - mNextRenderTime;
|
||||
if (lateBy > mFrameDuration)
|
||||
{
|
||||
tick.skippedFrames = static_cast<uint64_t>(lateBy / mFrameDuration);
|
||||
++mOverrunCount;
|
||||
mSkippedFrameCount += tick.skippedFrames;
|
||||
}
|
||||
return tick;
|
||||
}
|
||||
|
||||
void RenderCadenceClock::MarkRendered(TimePoint now)
|
||||
{
|
||||
mNextRenderTime += mFrameDuration;
|
||||
if (now - mNextRenderTime > mFrameDuration * 4)
|
||||
mNextRenderTime = now + mFrameDuration;
|
||||
}
|
||||
Reference in New Issue
Block a user