Modification de la boucle principale pour réduire la charge CPU
This commit is contained in:
parent
53c4573edb
commit
a40d724506
|
@ -18,7 +18,7 @@ private:
|
|||
std::string level_name;
|
||||
sf::Sprite background;
|
||||
|
||||
sf::Time accumulator;
|
||||
sf::Time next_frame_time;
|
||||
|
||||
std::vector<ObjectPtr> objects;
|
||||
std::vector<std::pair<float, float>> level_zone;
|
||||
|
|
|
@ -14,7 +14,6 @@ private:
|
|||
sf::RenderWindow window;
|
||||
sf::Clock clock;
|
||||
|
||||
sf::Time elapsed_time;
|
||||
ResourceManager resource_manager;
|
||||
std::array<bool, sf::Keyboard::KeyCount> 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
|
||||
|
|
30
src/game.cpp
30
src/game.cpp
|
@ -19,7 +19,9 @@ std::map<unsigned int, std::function<std::shared_ptr<Object>(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() {
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue