From ccf04a9bf34adc52c626d767aefd9f66c9852b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Tue, 12 Apr 2016 21:04:31 +0200 Subject: [PATCH] =?UTF-8?q?Autorise=20la=20boucle=20de=20rendu=20=C3=A0=20?= =?UTF-8?q?sauter=20des=20frames=20si=20on=20est=20en=20retard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/game.hpp | 10 ++++++---- src/game.cpp | 32 +++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/include/game.hpp b/include/game.hpp index 5ebe042..4640154 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -21,13 +21,15 @@ public: enum class DeathCause {NONE, OUT_OF_BOUNDS, KILLED, TIME_OUT}; private: - WidgetTimer widget_timer; - sf::Time next_frame_time; - std::vector pending_kill; - Mode mode; + + sf::Time next_frame_time; + unsigned int skipped_frames; + + std::vector pending_kill; DeathCause death_cause; + WidgetTimer widget_timer; float time_left; /** diff --git a/src/game.cpp b/src/game.cpp index a9db69f..20a41d8 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4,13 +4,23 @@ #include "game.hpp" #include "player.hpp" -Game::Game(Manager& manager) : Level(manager), - widget_timer(manager, false), - next_frame_time(manager.getCurrentTime()) { - mode = Game::Mode::NORMAL; - death_cause = Game::DeathCause::NONE; +/** + * Définition des variables et fonctions globales internes + * (accessibles uniquement dans ce fichier) + */ +namespace { + // nombre maximum de frames que l'on peut sauter + // en cas de charge CPU importante + const unsigned int MAX_FRAME_SKIP = 5; } +Game::Game(Manager& manager) : Level(manager), + mode(Game::Mode::NORMAL), + next_frame_time(manager.getCurrentTime()), + skipped_frames(0), + death_cause(Game::DeathCause::NONE), + widget_timer(manager, false) {} + Game::~Game() {} void Game::processEvent(const sf::Event& event) { @@ -95,10 +105,18 @@ void Game::frame() { // on s'assure que la caméra soit centrée sur nos joueurs ensureCentered(); - // si on a encore suffisamment de temps, on dessine - if (current_time < next_frame_time) { + // si on a encore suffisamment de temps, ou si on a sauté + // trop de frames, on dessine + if (current_time < next_frame_time || skipped_frames >= MAX_FRAME_SKIP) { draw(); } + + // sinon, on saute une frame de dessin. On stocke + // le nombre de frames sautées pour ne pas sauter plus que + // le maximum + else { + skipped_frames++; + } } else { // si nous sommes en avance, on endort le processus // le temps nécessaire pour revenir dans les temps