1
System / What is wrong with my self made frame rate limit code?
« on: December 20, 2019, 08:05:49 am »
Using window.setFramerateLimit(60), I get consistent FPS between 58-62, but I wanted to do things myself to be sure I understand how it works, so I made this code here: (notice the code in the loop function at the bottom.)
class SystemClock
{
public:
void establishFrameTime()
{
frametime = (double)frameClock.restart().asMicroseconds()/e6;
if (tempavgFrameTime == 0.0)
{
tempavgFrameTime = frametime;
}
else
{
tempavgFrameTime = (tempavgFrameTime + frametime) / 2.0;
}
accumulatedFrameTime += frametime;
if (accumulatedFrameTime >= 1.0)
{
avgFrameTime = tempavgFrameTime;
FPS = 1 / avgFrameTime;
accumulatedFrameTime = 0.0;
tempavgFrameTime = 0.0;
}
}
double const fixedTimeStep{ 1.0 / 60.0 };
double const e6{ 1000000 };
sf::Clock tickClock;
sf::Clock frameClock;
sf::Clock timeClock;
// time data
double FPS{ 0.0 };
double frametime{ 0.0 };
double avgFrameTime{ 0.0 };
private:
double tempavgFrameTime{ 0.0 };
double accumulatedFrameTime{ 0.0 };
};
void loop()
{
while (systemWindow.window.isOpen())
{
systemClock.establishFrameTime();
if (systemClock.frametime < systemClock.fixedTimeStep)
{
sf::Int64 remainder{ (sf::Int64)((systemClock.fixedTimeStep - systemClock.frametime) * systemClock.e6)};
sf::sleep(sf::microseconds(remainder));
}
update();
render();
}
}
When I run this, the framerate fluctuates between 80-100 sometimes spiking to 160. Why are my frames running too fast, am I not using sf::sleep correctly? Or is it my IDE im running visual studio in debug mode(but then why would there be a difference between this and window.setframerateLimit()
class SystemClock
{
public:
void establishFrameTime()
{
frametime = (double)frameClock.restart().asMicroseconds()/e6;
if (tempavgFrameTime == 0.0)
{
tempavgFrameTime = frametime;
}
else
{
tempavgFrameTime = (tempavgFrameTime + frametime) / 2.0;
}
accumulatedFrameTime += frametime;
if (accumulatedFrameTime >= 1.0)
{
avgFrameTime = tempavgFrameTime;
FPS = 1 / avgFrameTime;
accumulatedFrameTime = 0.0;
tempavgFrameTime = 0.0;
}
}
double const fixedTimeStep{ 1.0 / 60.0 };
double const e6{ 1000000 };
sf::Clock tickClock;
sf::Clock frameClock;
sf::Clock timeClock;
// time data
double FPS{ 0.0 };
double frametime{ 0.0 };
double avgFrameTime{ 0.0 };
private:
double tempavgFrameTime{ 0.0 };
double accumulatedFrameTime{ 0.0 };
};
void loop()
{
while (systemWindow.window.isOpen())
{
systemClock.establishFrameTime();
if (systemClock.frametime < systemClock.fixedTimeStep)
{
sf::Int64 remainder{ (sf::Int64)((systemClock.fixedTimeStep - systemClock.frametime) * systemClock.e6)};
sf::sleep(sf::microseconds(remainder));
}
update();
render();
}
}
When I run this, the framerate fluctuates between 80-100 sometimes spiking to 160. Why are my frames running too fast, am I not using sf::sleep correctly? Or is it my IDE im running visual studio in debug mode(but then why would there be a difference between this and window.setframerateLimit()