aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/crepe/api/LoopManager.cpp3
-rw-r--r--src/crepe/api/LoopTimer.cpp27
-rw-r--r--src/crepe/api/LoopTimer.h265
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