diff options
Diffstat (limited to 'src/crepe')
| -rw-r--r-- | src/crepe/api/LoopManager.cpp | 31 | ||||
| -rw-r--r-- | src/crepe/api/LoopManager.h | 4 | ||||
| -rw-r--r-- | src/crepe/api/LoopTimer.cpp | 37 | ||||
| -rw-r--r-- | src/crepe/api/LoopTimer.h | 15 | 
4 files changed, 42 insertions, 45 deletions
| diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp index 7edf4d1..4a6d2cd 100644 --- a/src/crepe/api/LoopManager.cpp +++ b/src/crepe/api/LoopManager.cpp @@ -6,20 +6,25 @@  #include "../system/PhysicsSystem.h"  #include "../system/RenderSystem.h"  #include "../system/ScriptSystem.h" - +#include "../api/EventManager.h"  #include "LoopManager.h"  #include "LoopTimer.h" - +#include <iostream>  using namespace crepe;  using namespace std;  LoopManager::LoopManager() { +	this->loop_timer = make_unique<LoopTimer>();  	this->load_system<AnimatorSystem>();  	this->load_system<CollisionSystem>();  	this->load_system<ParticleSystem>();  	this->load_system<PhysicsSystem>();  	this->load_system<RenderSystem>();  	this->load_system<ScriptSystem>(); +	EventManager::get_instance().subscribe<ShutDownEvent>([this](const ShutDownEvent& event) { +    	return this->on_shutdown(event); +	}); +  }  void LoopManager::process_input() { @@ -35,29 +40,27 @@ void LoopManager::set_running(bool running) { this->game_running = running; }  void LoopManager::fixed_update() {}  void LoopManager::loop() { -	LoopTimer & timer = LoopTimer::get_instance(); -	timer.start(); +	this->loop_timer->start();  	while (game_running) { -		timer.update(); +		this->loop_timer->update(); -		while (timer.get_lag() >= timer.get_fixed_delta_time()) { +		while (this->loop_timer->get_lag() >= this->loop_timer->get_fixed_delta_time()) {  			this->process_input();  			this->fixed_update(); -			timer.advance_fixed_update(); +			this->loop_timer->advance_fixed_update();  		}  		this->update();  		this->render(); - -		timer.enforce_frame_rate(); +		this->loop_timer->enforce_frame_rate();  	}  }  void LoopManager::setup() {  	this->game_running = true; -	LoopTimer::get_instance().start(); -	LoopTimer::get_instance().set_fps(200); +	this->loop_timer->start(); +	this->loop_timer->set_fps(60);  }  void LoopManager::render() { @@ -65,5 +68,9 @@ void LoopManager::render() {  		this->get_system<RenderSystem>().update();  	}  } +bool LoopManager::on_shutdown(const ShutDownEvent & e){ +	this->game_running = false; +	return false; +} -void LoopManager::update() { LoopTimer & timer = LoopTimer::get_instance(); } +void LoopManager::update() {} diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h index 13e6dac..ff1ff55 100644 --- a/src/crepe/api/LoopManager.h +++ b/src/crepe/api/LoopManager.h @@ -7,7 +7,7 @@  #include "api/SceneManager.h"  namespace crepe { - +class LoopTimer;  /**   * \brief Main game loop manager   * @@ -91,6 +91,8 @@ private:  	SceneManager scene_manager{component_manager};  private: +	std::unique_ptr<LoopTimer> loop_timer; +	bool on_shutdown(const ShutDownEvent & e);  	/**  	 * \brief Collection of System instances  	 * diff --git a/src/crepe/api/LoopTimer.cpp b/src/crepe/api/LoopTimer.cpp index 15a0e3a..d0a19d7 100644 --- a/src/crepe/api/LoopTimer.cpp +++ b/src/crepe/api/LoopTimer.cpp @@ -9,10 +9,6 @@ using namespace crepe;  LoopTimer::LoopTimer() { dbg_trace(); } -LoopTimer & LoopTimer::get_instance() { -	static LoopTimer instance; -	return instance; -}  void LoopTimer::start() {  	this->last_frame_time = std::chrono::steady_clock::now(); @@ -56,22 +52,25 @@ void LoopTimer::set_game_scale(double value) { this->game_scale = value; }  double LoopTimer::get_game_scale() const { return this->game_scale; }  void LoopTimer::enforce_frame_rate() { -	std::chrono::steady_clock::time_point current_frame_time -		= std::chrono::steady_clock::now(); -	std::chrono::milliseconds frame_duration -		= std::chrono::duration_cast<std::chrono::milliseconds>(current_frame_time -																- this->last_frame_time); - -	if (frame_duration < this->frame_target_time) { -		std::chrono::milliseconds delay_time -			= std::chrono::duration_cast<std::chrono::milliseconds>(this->frame_target_time -																	- frame_duration); -		if (delay_time.count() > 0) { -			SDLContext::get_instance().delay(delay_time.count()); -		} -	} +    auto current_frame_time = std::chrono::steady_clock::now(); +    auto frame_duration = current_frame_time - this->last_frame_time; -	this->last_frame_time = current_frame_time; +    if (frame_duration < this->frame_target_time) { +        auto remaining_time = this->frame_target_time - frame_duration; + +        // Sleep for most of the remaining time using SDLContext +        if (remaining_time > std::chrono::microseconds(2000)) { // 2ms threshold +            SDLContext::get_instance().delay( +                std::chrono::duration_cast<std::chrono::milliseconds>(remaining_time).count()); +        } + +        // Busy-wait for the last tiny remaining duration +        while (std::chrono::steady_clock::now() - current_frame_time < remaining_time) { +            // Busy wait +        } +    } + +    this->last_frame_time = std::chrono::steady_clock::now(); // Update frame time  }  double LoopTimer::get_lag() const { diff --git a/src/crepe/api/LoopTimer.h b/src/crepe/api/LoopTimer.h index 9393439..b20203d 100644 --- a/src/crepe/api/LoopTimer.h +++ b/src/crepe/api/LoopTimer.h @@ -6,13 +6,7 @@ namespace crepe {  class LoopTimer {  public: -	/** -	 * \brief Get the singleton instance of LoopTimer. -	 * -	 * \return A reference to the LoopTimer instance. -	 */ -	static LoopTimer & get_instance(); - +	LoopTimer();  	/**  	 * \brief Get the current delta time for the current frame.  	 * @@ -97,12 +91,7 @@ private:  	 */  	double get_lag() const; -	/** -	 * \brief Construct a new LoopTimer object. -	 * -	 * Private constructor for singleton pattern to restrict instantiation outside the class. -	 */ -	LoopTimer(); +	  	/**  	 * \brief Update the timer to the current frame. |