From 3c1a6970cd520620e6fd3ffe61a7011d23925a17 Mon Sep 17 00:00:00 2001 From: Ingo Ruhnke Date: Tue, 23 Jan 2007 15:13:10 +0000 Subject: [PATCH] - rewrote frameskip code, reinserted SDL_Delay() SVN-Revision: 4663 --- src/mainloop.cpp | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/mainloop.cpp b/src/mainloop.cpp index 55a87d3bd..55bc630ea 100644 --- a/src/mainloop.cpp +++ b/src/mainloop.cpp @@ -216,7 +216,6 @@ MainLoop::run() Uint32 last_ticks = 0; Uint32 elapsed_ticks = 0; - int skipped_frames = 0; running = true; while(running) { @@ -229,34 +228,33 @@ MainLoop::run() elapsed_ticks += ticks - last_ticks; last_ticks = ticks; - /* time for a new logical frame? */ - if(elapsed_ticks > TICKS_PER_FRAME) { - elapsed_ticks -= TICKS_PER_FRAME; - float timestep = 1.0 / LOGICAL_FPS; - real_time += timestep; - timestep *= speed; - game_time += timestep; - - process_events(); - update_gamelogic(timestep); + if (elapsed_ticks > TICKS_PER_FRAME*4) { + // when the game loads up or levels are switched the + // elapsed_ticks grows extremly large, so we just ignore those + // large time jumps + elapsed_ticks = 0; } - if(elapsed_ticks > TICKS_PER_FRAME) { - // too much time passed since last frame, the computer doesn't seem to be - // able to draw 64fps on screen, so skip 1 frame for now - skipped_frames++; + int frames = 0; + + if (elapsed_ticks > TICKS_PER_FRAME) { + while(elapsed_ticks > TICKS_PER_FRAME && frames < MAX_FRAME_SKIP) { + elapsed_ticks -= TICKS_PER_FRAME; + float timestep = 1.0 / LOGICAL_FPS; + real_time += timestep; + timestep *= speed; + game_time += timestep; - // slow down the game if we skip too many frames - if(skipped_frames > MAX_FRAME_SKIP) { - elapsed_ticks = elapsed_ticks % TICKS_PER_FRAME; - draw(context); - skipped_frames = 0; + process_events(); + update_gamelogic(timestep); + frames += 1; } - } else { + draw(context); - skipped_frames = 0; } sound_manager->update(); + + SDL_Delay(0); } } -- 2.11.0