std::chrono::system_clock::time_point m_BeginFrame = std::chrono::system_clock::now();
std::chrono::system_clock::time_point m_EndFrame = std::chrono::system_clock::now();
std::chrono::nanoseconds m_WorkTime = std::chrono::nanoseconds::zero();
std::chrono::nanoseconds m_WaitTime = std::chrono::nanoseconds::zero();
auto invFpsLimit = std::chrono::nanoseconds(1e9 / fpsLimit());
// main loop
while (!glfwWindowShouldClose(m_pScreen->glfwWindow()))
{
m_WaitTime = m_BeginFrame - m_EndFrame;
m_EndFrame = std::chrono::system_clock::now();
m_WorkTime = m_EndFrame - m_BeginFrame;
// if need sleep
if (m_WorkTime < invFpsLimit)
{
std::this_thread::sleep_until(m_BeginFrame + invFpsLimit);
m_DeltaTime = invFpsLimit;
}
else
{
m_DeltaTime = m_WorkTime;
}
m_BeginFrame = std::chrono::system_clock::now();
TRACE(" %f %u %u %u",
((float)1e9 / (float)(m_WaitTime.count() + m_WorkTime.count())),
m_WorkTime.count(),
m_WaitTime.count(),
invFpsLimit.count());
// …
Run Code Online (Sandbox Code Playgroud)