summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-10-05 13:21:38 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-10-05 13:21:38 (GMT)
commit4bb402f4fdb595fc6d4a612bfaf2514686401d2e (patch)
tree5eea13f414ae7a6b96aab9c9fc0c4826b2c6d01c /src
parent707c11203ea826208fdf2ad7a3688e1e33c20916 (diff)
downloadpowder-4bb402f4fdb595fc6d4a612bfaf2514686401d2e.zip
powder-4bb402f4fdb595fc6d4a612bfaf2514686401d2e.tar.gz
Fix stuttering issue with FPS cap
Diffstat (limited to 'src')
-rw-r--r--src/PowderToySDL.cpp52
1 files changed, 22 insertions, 30 deletions
diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp
index 75c1861..8236730 100644
--- a/src/PowderToySDL.cpp
+++ b/src/PowderToySDL.cpp
@@ -296,6 +296,9 @@ ui::Engine * engine = NULL;
void EngineProcess()
{
+ int frameStart;
+ float frameTime;
+ float frameTimeAvg = 0.0f, correctedFrameTimeAvg = 0.0f;
SDL_Event event;
while(engine->Running())
{
@@ -363,13 +366,30 @@ void EngineProcess()
}
if(engine->Broken()) { engine->UnBreak(); break; }
+ frameStart = SDL_GetTicks();
engine->Tick();
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
- lastTick = SDL_GetTicks();
+ lastTick = frameStart;
Client::Ref().Tick();
}
@@ -387,34 +407,6 @@ void EngineProcess()
else
blit(engine->g->vid);
#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
std::cout << "Breaking out of EngineProcess" << std::endl;