diff options
Diffstat (limited to 'src/crepe/api')
| -rw-r--r-- | src/crepe/api/LoopManager.cpp | 3 | ||||
| -rw-r--r-- | src/crepe/api/LoopTimer.cpp | 27 | ||||
| -rw-r--r-- | src/crepe/api/LoopTimer.h | 265 | 
3 files changed, 143 insertions, 152 deletions
| diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp index abf1f7e..d4345d0 100644 --- a/src/crepe/api/LoopManager.cpp +++ b/src/crepe/api/LoopManager.cpp @@ -6,7 +6,7 @@  #include "LoopManager.h"  #include "LoopTimer.h" -namespace crepe { +using namespace crepe;  LoopManager::LoopManager(const RenderSystem& renderSystem, const SDLContext& sdlContext,                           const LoopTimer& loopTimer, const ScriptSystem& scriptSystem,                           const SoundSystem& soundSystem, const ParticleSystem& particleSystem, @@ -64,4 +64,3 @@ void LoopManager::update() {      LoopTimer & timer = LoopTimer::get_instance();  } -} // namespace crepe diff --git a/src/crepe/api/LoopTimer.cpp b/src/crepe/api/LoopTimer.cpp index f4be510..dd4d7e5 100644 --- a/src/crepe/api/LoopTimer.cpp +++ b/src/crepe/api/LoopTimer.cpp @@ -1,18 +1,14 @@ -  #include "../facade/SDLContext.h"  #include "../util/log.h" -  #include "LoopTimer.h" -#define MS_PER_SECOND 1000.0 -  using namespace crepe;  LoopTimer::LoopTimer() { -	dbg_trace(); +    dbg_trace();  } -LoopTimer & LoopTimer::get_instance() { +LoopTimer& LoopTimer::get_instance() {      static LoopTimer instance;      return instance;  } @@ -26,41 +22,36 @@ void LoopTimer::start() {  void LoopTimer::update() {      uint64_t current_frame_time = SDLContext::get_instance().get_ticks(); -    this->delta_time = (current_frame_time - last_frame_time) / MS_PER_SECOND; +    this->delta_time = (current_frame_time - last_frame_time);      if (this->delta_time > this->maximum_delta_time) {          this->delta_time = this->maximum_delta_time;      } -    this->delta_time = this->game_scale; +    this->delta_time *= this->game_scale;      this->elapsed_time += this->delta_time;      this->last_frame_time = current_frame_time;  }  double LoopTimer::get_delta_time() const { return this->delta_time; } - -int LoopTimer::get_current_time() const { return this->elapsed_time; } - +double LoopTimer::get_current_time() const { return this->elapsed_time; }  void LoopTimer::advance_fixed_update() { this->elapsed_fixed_time += this->fixed_delta_time; } -  double LoopTimer::get_fixed_delta_time() const { return this->fixed_delta_time; }  void LoopTimer::set_fps(int fps) {      this->fps = fps; -    this->frame_target_time = 1.0 / this->fps; +    this->frame_target_time = 1000.0 / this->fps;   }  int LoopTimer::get_fps() const { return this->fps; } - -void LoopTimer::set_game_scale(double value) { this->game_scale = value; }; - +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() {      uint64_t current_frame_time = SDLContext::get_instance().get_ticks(); -    double frame_duration = (current_frame_time - this->last_frame_time) / MS_PER_SECOND; +    double frame_duration = (current_frame_time - this->last_frame_time);      if (frame_duration < this->frame_target_time) { -        uint32_t delay_time = static_cast<uint32_t>((this->frame_target_time - frame_duration) * MS_PER_SECOND); +        uint32_t delay_time = static_cast<uint32_t>(this->frame_target_time - frame_duration);          SDLContext::get_instance().delay(delay_time);      } diff --git a/src/crepe/api/LoopTimer.h b/src/crepe/api/LoopTimer.h index 4ce0053..5f9b6a7 100644 --- a/src/crepe/api/LoopTimer.h +++ b/src/crepe/api/LoopTimer.h @@ -2,142 +2,143 @@  #include <cstdint> -namespace crepe{ +namespace crepe {  class LoopTimer {  public: -	/** -	 * \brief Get the singleton instance of LoopTimer. -	 * -	 * \return A reference to the LoopTimer instance. -	 */ -	static LoopTimer& get_instance(); - -	/** -	 * \brief Get the current delta time for the current frame. -	 * -	 * \return Delta time in seconds since the last frame. -	 */ -	double get_delta_time() const; - -	/** -	 * \brief Get the current game time. -	 * -	 * \note The current game time may vary from the real-world elapsed time. -	 * It is the cumulative sum of each frame's delta time. -	 * -	 * \return Elapsed game time in milliseconds. -	 */ -	int get_current_time() const; - -	/** -	 * \brief Set the target frames per second (FPS). -	 * -	 * \param fps The number of frames that should be rendered per second. -	 */ -	void set_fps(int fps); - -	/** -	 * \brief Get the current frames per second (FPS). -	 * -	 * \return Current FPS. -	 */ -	int get_fps() const; - -	/** -	 * \brief Get the current game scale. -	 * -	 * \return The current game scale, where 0 = paused, 1 = normal speed, and values > 1 speed up the game. -	 */ -	double get_game_scale() const; - -	/** -	 * \brief Set the game scale. -	 * -	 * \param game_scale The desired game scale (0 = pause, 1 = normal speed, > 1 = speed up). -	 */ -	void set_game_scale(double game_scale); - -	private: -	friend class LoopManager; - -	/** -	 * \brief Start the loop timer. -	 * -	 * Initializes the timer to begin tracking frame times. -	 */ -	void start(); - -	/** -	 * \brief Enforce the frame rate limit. -	 * -	 * Ensures that the game loop does not exceed the target FPS by delaying -	 * frame updates as necessary. -	 */ -	void enforce_frame_rate(); - -	/** -	 * \brief Get the fixed delta time for consistent updates. -	 * -	 * Fixed delta time is used for operations that require uniform time steps, -	 * such as physics calculations. -	 * -	 * \return Fixed delta time in seconds. -	 */ -	double get_fixed_delta_time() const; - -	/** -	 * \brief Get the accumulated lag in the game loop. -	 * -	 * Lag represents the difference between the target frame time and the -	 * actual frame time, useful for managing fixed update intervals. -	 * -	 * \return Accumulated lag in seconds. -	 */ -	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. -	 * -	 * Calculates and updates the delta time for the current frame and adds it to -	 * the cumulative game time. -	 */ -	void update(); - -	/** -	 * \brief Advance the game loop by a fixed update interval. -	 * -	 * This method progresses the game state by a consistent, fixed time step, -	 * allowing for stable updates independent of frame rate fluctuations. -	 */ -	void advance_fixed_update(); +    /** +     * \brief Get the singleton instance of LoopTimer. +     * +     * \return A reference to the LoopTimer instance. +     */ +    static LoopTimer& get_instance(); + +    /** +     * \brief Get the current delta time for the current frame. +     * +     * \return Delta time in milliseconds since the last frame. +     */ +    double get_delta_time() const; + +    /** +     * \brief Get the current game time. +     * +     * \note The current game time may vary from real-world elapsed time. +     * It is the cumulative sum of each frame's delta time. +     * +     * \return Elapsed game time in milliseconds. +     */ +    double get_current_time() const; + +    /** +     * \brief Set the target frames per second (FPS). +     * +     * \param fps The desired frames rendered per second. +     */ +    void set_fps(int fps); + +    /** +     * \brief Get the current frames per second (FPS). +     * +     * \return Current FPS. +     */ +    int get_fps() const; + +    /** +     * \brief Get the current game scale. +     * +     * \return The current game scale, where 0 = paused, 1 = normal speed, and values > 1 speed up the game. +     */ +    double get_game_scale() const; + +    /** +     * \brief Set the game scale. +     * +     * \param game_scale The desired game scale (0 = pause, 1 = normal speed, > 1 = speed up). +     */ +    void set_game_scale(double game_scale); + +private: +    friend class LoopManager; + +    /** +     * \brief Start the loop timer. +     * +     * Initializes the timer to begin tracking frame times. +     */ +    void start(); + +    /** +     * \brief Enforce the frame rate limit. +     * +     * Ensures that the game loop does not exceed the target FPS by delaying +     * frame updates as necessary. +     */ +    void enforce_frame_rate(); + +    /** +     * \brief Get the fixed delta time for consistent updates. +     * +     * Fixed delta time is used for operations that require uniform time steps, +     * such as physics calculations. +     * +     * \return Fixed delta time in milliseconds. +     */ +    double get_fixed_delta_time() const; + +    /** +     * \brief Get the accumulated lag in the game loop. +     * +     * Lag represents the difference between the target frame time and the +     * actual frame time, useful for managing fixed update intervals. +     * +     * \return Accumulated lag in milliseconds. +     */ +    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. +     * +     * Calculates and updates the delta time for the current frame and adds it to +     * the cumulative game time. +     */ +    void update(); + +    /** +     * \brief Advance the game loop by a fixed update interval. +     * +     * This method progresses the game state by a consistent, fixed time step, +     * allowing for stable updates independent of frame rate fluctuations. +     */ +    void advance_fixed_update(); +  private: -	//!  Current frames per second -	int fps = 50; -	//! Current game scale                     -	double game_scale = 1;        -	//! Maximum delta time to avoid large jumps        -	double maximum_delta_time = 0.25;   -	//! Delta time for the current frame  -	double delta_time = 0;          -	//! Target time per frame in seconds      -	double frame_target_time = 1.0 / fps;  -	//! Fixed delta time for fixed updates -	double fixed_delta_time = 0.02;  -	//! Total elapsed game time     -	double elapsed_time = 0;     -	//! Total elapsed time for fixed updates          -	double elapsed_fixed_time = 0;  -	//! Time of the last frame      -	uint64_t last_frame_time = 0;       +    //! Current frames per second +    int fps = 50; +    //! Current game scale +    double game_scale = 1; +    //! Maximum delta time in milliseconds to avoid large jumps +    double maximum_delta_time = 250; +    //! Delta time for the current frame in milliseconds +    double delta_time = 0; +    //! Target time per frame in milliseconds +    double frame_target_time = 1000.0 / fps; +    //! Fixed delta time for fixed updates in milliseconds +    double fixed_delta_time = 20; +    //! Total elapsed game time in milliseconds +    double elapsed_time = 0; +    //! Total elapsed time for fixed updates in milliseconds +    double elapsed_fixed_time = 0; +    //! Time of the last frame in milliseconds +    uint64_t last_frame_time = 0;  };  } // namespace crepe |