aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/manager
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/manager')
-rw-r--r--src/crepe/manager/LoopTimerManager.cpp56
-rw-r--r--src/crepe/manager/LoopTimerManager.h64
-rw-r--r--src/crepe/manager/Mediator.h1
3 files changed, 59 insertions, 62 deletions
diff --git a/src/crepe/manager/LoopTimerManager.cpp b/src/crepe/manager/LoopTimerManager.cpp
index 8725c33..a306eb7 100644
--- a/src/crepe/manager/LoopTimerManager.cpp
+++ b/src/crepe/manager/LoopTimerManager.cpp
@@ -6,7 +6,7 @@
#include "LoopTimerManager.h"
using namespace crepe;
-
+using namespace std::chrono_literals;
LoopTimerManager::LoopTimerManager(Mediator & mediator) : Manager(mediator) {
this->mediator.loop_timer = *this;
dbg_trace();
@@ -15,62 +15,57 @@ LoopTimerManager::LoopTimerManager(Mediator & mediator) : Manager(mediator) {
void LoopTimerManager::start() {
this->last_frame_time = std::chrono::steady_clock::now();
- this->elapsed_time = std::chrono::milliseconds(0);
+ this->elapsed_time = 0s;
// by starting the elapsed_fixed_time at (0 - fixed_delta_time) in milliseconds it calls a fixed update at the start of the loop.
this->elapsed_fixed_time
- = -std::chrono::duration_cast<std::chrono::milliseconds>(fixed_delta_time);
- this->delta_time = std::chrono::milliseconds(0);
+ = -std::chrono::duration_cast<ElapsedTime_t>(this->fixed_delta_time);
+ this->delta_time = 0s;
}
void LoopTimerManager::update() {
- std::chrono::steady_clock::time_point current_frame_time
+ TimePoint_t current_frame_time
= std::chrono::steady_clock::now();
// Convert to duration in seconds for delta time
- this->delta_time = std::chrono::duration_cast<std::chrono::duration<double>>(
- current_frame_time - last_frame_time);
+ this->delta_time = current_frame_time - last_frame_time;
if (this->delta_time > this->maximum_delta_time) {
this->delta_time = this->maximum_delta_time;
}
- if (this->delta_time.count() > 0.0) {
+ if (this->delta_time > 0s) {
this->actual_fps = 1.0 / this->delta_time.count();
} else {
this->actual_fps = 0;
}
-
- this->elapsed_time += this->delta_time;
+ this->elapsed_time += std::chrono::duration_cast<ElapsedTime_t>(this->delta_time);
this->last_frame_time = current_frame_time;
}
-double LoopTimerManager::get_delta_time() const {
- return this->delta_time.count() * this->time_scale;
-}
+Duration_t LoopTimerManager::get_delta_time() const {return this->delta_time * this->time_scale;}
-double LoopTimerManager::get_current_time() const { return this->elapsed_time.count(); }
+ElapsedTime_t LoopTimerManager::get_elapsed_time() const { return this->elapsed_time; }
void LoopTimerManager::advance_fixed_elapsed_time() {
- this->elapsed_fixed_time += this->fixed_delta_time;
+ this->elapsed_fixed_time += std::chrono::duration_cast<ElapsedTime_t>(this->fixed_delta_time);
}
-void LoopTimerManager::set_target_fps(int fps) {
+void LoopTimerManager::set_target_framerate(unsigned fps) {
this->target_fps = fps;
//check if fps is lower or equals 0
if (fps <= 0) return;
// target time per frame in seconds
- this->frame_target_time = std::chrono::duration<double>(1.0) / this->target_fps;
+ this->frame_target_time = Duration_t(1s) / this->target_fps;
}
-int LoopTimerManager::get_fps() const { return this->actual_fps; }
+unsigned LoopTimerManager::get_fps() const { return this->actual_fps; }
void LoopTimerManager::set_time_scale(double value) { this->time_scale = value; }
-double LoopTimerManager::get_time_scale() const { return this->time_scale; }
+float LoopTimerManager::get_time_scale() const { return this->time_scale; }
void LoopTimerManager::enforce_frame_rate() {
- std::chrono::steady_clock::time_point current_frame_time
+ TimePoint_t current_frame_time
= std::chrono::steady_clock::now();
- std::chrono::duration<double> frame_duration = current_frame_time - this->last_frame_time;
-
+ Duration_t frame_duration = current_frame_time - this->last_frame_time;
// Check if frame duration is less than the target frame time
if (frame_duration < this->frame_target_time) {
std::chrono::microseconds delay_time
@@ -83,16 +78,17 @@ void LoopTimerManager::enforce_frame_rate() {
}
}
-double LoopTimerManager::get_lag() const {
- return (this->elapsed_time - this->elapsed_fixed_time).count();
+Duration_t LoopTimerManager::get_lag() const {
+ return (this->elapsed_time - this->elapsed_fixed_time);
}
-double LoopTimerManager::get_scaled_fixed_delta_time() const {
- return this->fixed_delta_time.count() * this->time_scale;
+
+Duration_t LoopTimerManager::get_scaled_fixed_delta_time() const {
+ return this->fixed_delta_time * this->time_scale;
}
-void LoopTimerManager::set_fixed_delta_time(double seconds) {
- this->fixed_delta_time = std::chrono::duration<double>(seconds);
+void LoopTimerManager::set_fixed_delta_time(float seconds) {
+ this->fixed_delta_time = Duration_t(seconds);
}
-double LoopTimerManager::get_fixed_delta_time() const {
- return this->fixed_delta_time.count();
+Duration_t LoopTimerManager::get_fixed_delta_time() const {
+ return this->fixed_delta_time;
}
diff --git a/src/crepe/manager/LoopTimerManager.h b/src/crepe/manager/LoopTimerManager.h
index ec44d52..c5f3cb0 100644
--- a/src/crepe/manager/LoopTimerManager.h
+++ b/src/crepe/manager/LoopTimerManager.h
@@ -5,7 +5,9 @@
#include "Manager.h"
namespace crepe {
-
+typedef std::chrono::duration<float> Duration_t;
+typedef std::chrono::duration<unsigned long long, std::micro> ElapsedTime_t;
+typedef std::chrono::steady_clock::time_point TimePoint_t;
/**
* \brief Manages timing and frame rate for the game loop.
*
@@ -28,31 +30,31 @@ public:
*
* \return Delta time in seconds since the last frame.
*/
- double get_delta_time() const;
+ Duration_t get_delta_time() const;
/**
- * \brief Get the current game time.
+ * \brief Get the current elapsed time (total time passed )
*
* \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 seconds.
*/
- double get_current_time() const;
+ ElapsedTime_t get_elapsed_time() const;
/**
* \brief Set the target frames per second (FPS).
*
* \param fps The desired frames rendered per second.
*/
- void set_target_fps(int fps);
+ void set_target_framerate(unsigned fps);
/**
* \brief Get the current frames per second (FPS).
*
* \return Current FPS.
*/
- int get_fps() const;
+ unsigned get_fps() const;
/**
* \brief Get the current time scale.
@@ -60,7 +62,7 @@ public:
* \return The current time scale, where (0 = pause, < 1 = slow down, 1 = normal speed, > 1 = speed up).
* up the game.
*/
- double get_time_scale() const;
+ float get_time_scale() const;
/**
* \brief Set the time scale.
@@ -76,11 +78,10 @@ public:
*
* This value is used in the LoopManager to determine how many times
* the fixed_update should be called within a given interval.
- * This value is also the timing value which is used in the fixed_loop to convert pixels to time.
*
* \return The unscaled fixed delta time in seconds.
*/
- double get_fixed_delta_time() const;
+ Duration_t get_fixed_delta_time() const;
/**
* \brief Set the fixed_delta_time in seconds.
@@ -88,9 +89,9 @@ public:
* \param seconds fixed_delta_time in seconds.
*
* The fixed_delta_time value is used to determine how many times per second the fixed_update and process_input functions are called.
- * This value is also the timing value which is used in the fixed_loop to convert pixels to time.
+ *
*/
- void set_fixed_delta_time(double seconds);
+ void set_fixed_delta_time(float seconds);
/**
* \brief Retrieves the scaled fixed delta time in seconds.
@@ -101,12 +102,11 @@ public:
*
* \return The fixed delta time, scaled by the current time scale, in seconds.
*/
- double get_scaled_fixed_delta_time() const;
+ Duration_t get_scaled_fixed_delta_time() const;
private:
//! Friend relation to use start,enforce_frame_rate,get_lag,update,advance_fixed_update.
friend class LoopManager;
-
/**
* \brief Start the loop timer.
*
@@ -128,7 +128,7 @@ private:
*
* \return Accumulated lag in seconds.
*/
- double get_lag() const;
+ Duration_t get_lag() const;
/**
* \brief Update the timer to the current frame.
@@ -147,27 +147,27 @@ private:
void advance_fixed_elapsed_time();
private:
- //! Target frames per second
+ //! Target frames per second.
int target_fps = 60;
- //! Actual frames per second
+ //! Actual frames per second.
int actual_fps = 0;
- //! Time scale for speeding up or slowing down the game (0 = pause, < 1 = slow down, 1 = normal speed, > 1 = speed up)
- double time_scale = 1;
- //! Maximum delta time in seconds to avoid large jumps
- std::chrono::duration<double> maximum_delta_time{0.25};
- //! Delta time for the current frame in seconds
- std::chrono::duration<double> delta_time{0.0};
+ //! Time scale for speeding up or slowing down the game (0 = pause, < 1 = slow down, 1 = normal speed, > 1 = speed up).
+ float time_scale = 1;
+ //! Maximum delta time in seconds to avoid large jumps.
+ Duration_t maximum_delta_time{0.25};
+ //! Delta time for the current frame in seconds.
+ Duration_t delta_time{0.0};
//! Target time per frame in seconds
- std::chrono::duration<double> frame_target_time
- = std::chrono::duration<double>(1.0) / target_fps;
- //! Fixed delta time for fixed updates in seconds
- std::chrono::duration<double> fixed_delta_time = std::chrono::duration<double>(1.0) / 50.0;
- //! Total elapsed game time in seconds
- std::chrono::duration<double> elapsed_time{0.0};
- //! Total elapsed time for fixed updates in seconds
- std::chrono::duration<double> elapsed_fixed_time{0.0};
- //! Time of the last frame
- std::chrono::steady_clock::time_point last_frame_time;
+ Duration_t frame_target_time
+ = Duration_t(1.0) / target_fps;
+ //! Fixed delta time for fixed updates in seconds.
+ Duration_t fixed_delta_time = Duration_t(1.0) / 50.0;
+ //! Total elapsed game time in microseconds.
+ ElapsedTime_t elapsed_time{0};
+ //! Total elapsed time for fixed updates in microseconds.
+ ElapsedTime_t elapsed_fixed_time{0};
+ //! Time of the last frame.
+ TimePoint_t last_frame_time;
};
} // namespace crepe
diff --git a/src/crepe/manager/Mediator.h b/src/crepe/manager/Mediator.h
index eb8a7a5..ad51cc6 100644
--- a/src/crepe/manager/Mediator.h
+++ b/src/crepe/manager/Mediator.h
@@ -11,6 +11,7 @@ namespace crepe {
class ComponentManager;
class SceneManager;
+
class LoopTimerManager;
class EventManager;
/**