From a40d7245064322c5724b1294de0e5a004b8d23ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 3 Apr 2016 20:19:48 +0200 Subject: [PATCH] =?UTF-8?q?Modification=20de=20la=20boucle=20principale=20?= =?UTF-8?q?pour=20r=C3=A9duire=20la=20charge=20CPU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/game.hpp | 2 +- include/manager.hpp | 6 ++---- src/game.cpp | 30 +++++++++++++++++++++--------- src/manager.cpp | 7 +++---- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/include/game.hpp b/include/game.hpp index 8b37858..f8d2f24 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -18,7 +18,7 @@ private: std::string level_name; sf::Sprite background; - sf::Time accumulator; + sf::Time next_frame_time; std::vector objects; std::vector> level_zone; diff --git a/include/manager.hpp b/include/manager.hpp index ba26cf6..13ec34d 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -14,7 +14,6 @@ private: sf::RenderWindow window; sf::Clock clock; - sf::Time elapsed_time; ResourceManager resource_manager; std::array keys; @@ -39,10 +38,9 @@ public: sf::RenderWindow& getWindow(); /** - * Renvoie le temps écoulé entre la frame précédente - * et la frame actuelle + * Renvoie le temps actuel du jeu */ - sf::Time getElapsedTime() const; + sf::Time getCurrentTime() const; /** * Renvoie le gestionnaire de ressources diff --git a/src/game.cpp b/src/game.cpp index 71d9c43..bab65f7 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -19,7 +19,9 @@ std::map(std::ifstream&)>> o {Block::TYPE_ID, Block::load} }; -Game::Game(Manager& manager) : View(manager), accumulator(sf::Time::Zero) {} +Game::Game(Manager& manager) : View(manager), + next_frame_time(manager.getCurrentTime()) {} + Game::~Game() { objects.clear(); } @@ -109,15 +111,25 @@ void Game::save() { } void Game::frame() { - // tant qu'il reste du temps à passer, - // effectuer la simulation physique étape par étape - while (accumulator > Constants::PHYSICS_TIME) { - accumulator -= Constants::PHYSICS_TIME; - update(); - } + sf::Time current_time = manager.getCurrentTime(); - draw(); - accumulator += manager.getElapsedTime(); + if (current_time >= next_frame_time) { + // si nous sommes en retard ou dans les temps + // on replanifie la prochaine frame + next_frame_time += Constants::PHYSICS_TIME; + + // on met à jour la physique d'un cran temporel + update(); + + // si on a encore suffisamment de temps, on dessine + if (current_time < next_frame_time) { + draw(); + } + } else { + // si nous sommes en avance, on endort le processus + // le temps nécessaire pour revenir dans les temps + sf::sleep(next_frame_time - current_time); + } } void Game::update() { diff --git a/src/manager.cpp b/src/manager.cpp index 2885cd1..f05da87 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -3,7 +3,7 @@ Manager::Manager() : window( sf::VideoMode(704, 480), "Projet CMI", sf::Style::Default, sf::ContextSettings(0, 0, 2) -), elapsed_time(sf::Time::Zero), view(NULL) { +), view(NULL) { keys.fill(false); } @@ -42,7 +42,6 @@ void Manager::start() { throw std::runtime_error("Aucune vue à afficher pour le jeu"); } - elapsed_time = clock.restart(); view->frame(); } } @@ -55,8 +54,8 @@ sf::RenderWindow& Manager::getWindow() { return window; } -sf::Time Manager::getElapsedTime() const { - return elapsed_time; +sf::Time Manager::getCurrentTime() const { + return clock.getElapsedTime(); } ResourceManager& Manager::getResourceManager() {