From: Ingo Ruhnke Date: Tue, 23 Jan 2007 15:13:10 +0000 (+0000) Subject: - rewrote frameskip code, reinserted SDL_Delay() X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=3c1a6970cd520620e6fd3ffe61a7011d23925a17;p=supertux.git - rewrote frameskip code, reinserted SDL_Delay() SVN-Revision: 4663 --- 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); } }