Fix stuttering issue with FPS cap
This commit is contained in:
parent
707c11203e
commit
4bb402f4fd
@ -296,6 +296,9 @@ ui::Engine * engine = NULL;
|
|||||||
|
|
||||||
void EngineProcess()
|
void EngineProcess()
|
||||||
{
|
{
|
||||||
|
int frameStart;
|
||||||
|
float frameTime;
|
||||||
|
float frameTimeAvg = 0.0f, correctedFrameTimeAvg = 0.0f;
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while(engine->Running())
|
while(engine->Running())
|
||||||
{
|
{
|
||||||
@ -363,13 +366,30 @@ void EngineProcess()
|
|||||||
}
|
}
|
||||||
if(engine->Broken()) { engine->UnBreak(); break; }
|
if(engine->Broken()) { engine->UnBreak(); break; }
|
||||||
|
|
||||||
|
frameStart = SDL_GetTicks();
|
||||||
engine->Tick();
|
engine->Tick();
|
||||||
engine->Draw();
|
engine->Draw();
|
||||||
|
frameTime = SDL_GetTicks() - frameStart;
|
||||||
|
|
||||||
if(SDL_GetTicks()-lastTick>250)
|
frameTimeAvg = (frameTimeAvg*(1.0f-0.2f)) + (0.2f*frameTime);
|
||||||
|
if(ui::Engine::Ref().FpsLimit > 2.0f)
|
||||||
|
{
|
||||||
|
float targetFrameTime = 1000.0f/((float)ui::Engine::Ref().FpsLimit);
|
||||||
|
if(targetFrameTime - frameTimeAvg > 0)
|
||||||
|
{
|
||||||
|
SDL_Delay((targetFrameTime - frameTimeAvg) + 0.5f);
|
||||||
|
frameTime = SDL_GetTicks() - frameStart;//+= (int)(targetFrameTime - frameTimeAvg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
correctedFrameTimeAvg = (correctedFrameTimeAvg*(1.0f-0.05f)) + (0.05f*frameTime);
|
||||||
|
fps = 1000.0f/correctedFrameTimeAvg;
|
||||||
|
engine->SetFps(fps);
|
||||||
|
|
||||||
|
if(frameStart-lastTick>250)
|
||||||
{
|
{
|
||||||
//Run client tick every second
|
//Run client tick every second
|
||||||
lastTick = SDL_GetTicks();
|
lastTick = frameStart;
|
||||||
Client::Ref().Tick();
|
Client::Ref().Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,34 +407,6 @@ void EngineProcess()
|
|||||||
else
|
else
|
||||||
blit(engine->g->vid);
|
blit(engine->g->vid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
currentFrame++;
|
|
||||||
currentTime = SDL_GetTicks();
|
|
||||||
elapsedTime = currentTime - lastTime;
|
|
||||||
if(ui::Engine::Ref().FpsLimit > 2.0f && (currentFrame>2 || elapsedTime > 1000*2/ui::Engine::Ref().FpsLimit) && elapsedTime && currentFrame*1000/elapsedTime > ui::Engine::Ref().FpsLimit)
|
|
||||||
{
|
|
||||||
while (currentFrame*1000/elapsedTime > ui::Engine::Ref().FpsLimit)
|
|
||||||
{
|
|
||||||
SDL_Delay(1);
|
|
||||||
currentTime = SDL_GetTicks();
|
|
||||||
elapsedTime = currentTime-lastTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(elapsedTime>=1000)
|
|
||||||
{
|
|
||||||
fps = (((float)currentFrame)/((float)elapsedTime))*1000.0f;
|
|
||||||
currentFrame = 0;
|
|
||||||
lastTime = currentTime;
|
|
||||||
if(ui::Engine::Ref().FpsLimit > 2.0f)
|
|
||||||
{
|
|
||||||
delta = ui::Engine::Ref().FpsLimit/fps;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delta = 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
engine->SetFps(fps);
|
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
std::cout << "Breaking out of EngineProcess" << std::endl;
|
std::cout << "Breaking out of EngineProcess" << std::endl;
|
||||||
|
Loading…
Reference in New Issue
Block a user