← Back to file list Raw

src/CThreadSleeper.cpp

#include "CThreadSleeper.h"
CThreadSleeper::CThreadSleeper()
{
m_LastTick = m_NextTick = m_CurrentTick = CClock::now();
}
void CThreadSleeper::Start(unsigned int maxfps)
{
m_MaxFps = maxfps;
m_CurrentTick = CClock::now();
std::chrono::duration<double> delta = m_CurrentTick - m_LastTick;
m_DeltaTime = delta.count();
m_LastTick = m_CurrentTick;
if (m_MaxFps)
{
m_WaitTime = 1.0 / static_cast<double>(m_MaxFps);
auto interval = std::chrono::duration<double>(m_WaitTime);
m_NextTick = std::chrono::time_point_cast<CClock::duration>(m_CurrentTick + interval);
}
else
{
m_NextTick = m_CurrentTick;
}
}
void CThreadSleeper::End(bool yield, bool adaptive_sleep, bool strict_sleep)
{
auto now = CClock::now();
if (m_MaxFps)
{
if(adaptive_sleep)
{
if (now < m_NextTick)
{
std::this_thread::sleep_until(m_NextTick);
}
else
{
//too late!
m_NextTick = now;
}
}
if(strict_sleep)
{
std::this_thread::sleep_for(std::chrono::duration<double>(m_WaitTime));
}
while (CClock::now() < m_NextTick)
{
if(yield)
{
std::this_thread::yield();
}
}
}
now = CClock::now();
}