Modification de la boucle principale pour réduire la charge CPU

This commit is contained in:
Mattéo Delabre 2016-04-03 20:19:48 +02:00
parent 53c4573edb
commit a40d724506
4 changed files with 27 additions and 18 deletions

View File

@ -18,7 +18,7 @@ private:
std::string level_name; std::string level_name;
sf::Sprite background; sf::Sprite background;
sf::Time accumulator; sf::Time next_frame_time;
std::vector<ObjectPtr> objects; std::vector<ObjectPtr> objects;
std::vector<std::pair<float, float>> level_zone; std::vector<std::pair<float, float>> level_zone;

View File

@ -14,7 +14,6 @@ private:
sf::RenderWindow window; sf::RenderWindow window;
sf::Clock clock; sf::Clock clock;
sf::Time elapsed_time;
ResourceManager resource_manager; ResourceManager resource_manager;
std::array<bool, sf::Keyboard::KeyCount> keys; std::array<bool, sf::Keyboard::KeyCount> keys;
@ -39,10 +38,9 @@ public:
sf::RenderWindow& getWindow(); sf::RenderWindow& getWindow();
/** /**
* Renvoie le temps écoulé entre la frame précédente * Renvoie le temps actuel du jeu
* et la frame actuelle
*/ */
sf::Time getElapsedTime() const; sf::Time getCurrentTime() const;
/** /**
* Renvoie le gestionnaire de ressources * Renvoie le gestionnaire de ressources

View File

@ -19,7 +19,9 @@ std::map<unsigned int, std::function<std::shared_ptr<Object>(std::ifstream&)>> o
{Block::TYPE_ID, Block::load} {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() { Game::~Game() {
objects.clear(); objects.clear();
} }
@ -109,15 +111,25 @@ void Game::save() {
} }
void Game::frame() { void Game::frame() {
// tant qu'il reste du temps à passer, sf::Time current_time = manager.getCurrentTime();
// effectuer la simulation physique étape par étape
while (accumulator > Constants::PHYSICS_TIME) {
accumulator -= Constants::PHYSICS_TIME;
update();
}
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(); draw();
accumulator += manager.getElapsedTime(); }
} 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() { void Game::update() {

View File

@ -3,7 +3,7 @@
Manager::Manager() : window( Manager::Manager() : window(
sf::VideoMode(704, 480), "Projet CMI", sf::Style::Default, sf::VideoMode(704, 480), "Projet CMI", sf::Style::Default,
sf::ContextSettings(0, 0, 2) sf::ContextSettings(0, 0, 2)
), elapsed_time(sf::Time::Zero), view(NULL) { ), view(NULL) {
keys.fill(false); keys.fill(false);
} }
@ -42,7 +42,6 @@ void Manager::start() {
throw std::runtime_error("Aucune vue à afficher pour le jeu"); throw std::runtime_error("Aucune vue à afficher pour le jeu");
} }
elapsed_time = clock.restart();
view->frame(); view->frame();
} }
} }
@ -55,8 +54,8 @@ sf::RenderWindow& Manager::getWindow() {
return window; return window;
} }
sf::Time Manager::getElapsedTime() const { sf::Time Manager::getCurrentTime() const {
return elapsed_time; return clock.getElapsedTime();
} }
ResourceManager& Manager::getResourceManager() { ResourceManager& Manager::getResourceManager() {