diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-12-13 18:17:07 +0100 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-12-13 18:17:07 +0100 |
commit | 1076fb0e44611c29257b87eaa2cf51ad5046f133 (patch) | |
tree | e66d54c588c24bc1a953cdeb0722ade2595b6023 /src | |
parent | 1d1c256eea43a3d0685919ed2997e10990ef639f (diff) | |
parent | 8f20aac54aed1a060d59d5169276ef3ed33a8dc9 (diff) |
merge master
Diffstat (limited to 'src')
-rw-r--r-- | src/crepe/manager/LoopTimerManager.cpp | 2 | ||||
-rw-r--r-- | src/crepe/manager/LoopTimerManager.h | 8 | ||||
-rw-r--r-- | src/crepe/system/AnimatorSystem.cpp | 5 | ||||
-rw-r--r-- | src/test/LoopTimerTest.cpp | 18 |
4 files changed, 26 insertions, 7 deletions
diff --git a/src/crepe/manager/LoopTimerManager.cpp b/src/crepe/manager/LoopTimerManager.cpp index a98a29d..e78f92f 100644 --- a/src/crepe/manager/LoopTimerManager.cpp +++ b/src/crepe/manager/LoopTimerManager.cpp @@ -31,7 +31,7 @@ void LoopTimerManager::update() { this->delta_time = this->maximum_delta_time; } if (this->delta_time > 0s) { - this->actual_fps = 1.0 / duration_cast<seconds>(this->delta_time).count(); + this->actual_fps = static_cast<unsigned>(1.0 / this->delta_time.count()); } else { this->actual_fps = 0; } diff --git a/src/crepe/manager/LoopTimerManager.h b/src/crepe/manager/LoopTimerManager.h index 139294d..2f1e6b6 100644 --- a/src/crepe/manager/LoopTimerManager.h +++ b/src/crepe/manager/LoopTimerManager.h @@ -8,7 +8,7 @@ namespace crepe { class Engine; -typedef std::chrono::duration<double> duration_t; +typedef std::chrono::duration<float> duration_t; typedef std::chrono::duration<unsigned long long, std::micro> elapsed_time_t; /** @@ -57,7 +57,7 @@ public: * * \return Current FPS. */ - unsigned get_fps() const; + unsigned int get_fps() const; /** * \brief Get the current time scale. @@ -151,9 +151,9 @@ private: private: //! Target frames per second. - unsigned target_fps = 60; + unsigned int target_fps = 60; //! Actual frames per second. - unsigned actual_fps = 0; + unsigned 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). float time_scale = 1; //! Maximum delta time in seconds to avoid large jumps. diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index ad4eaa8..e5ab2fa 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -1,20 +1,23 @@ #include "../api/Animator.h" #include "../manager/ComponentManager.h" #include "../manager/LoopTimerManager.h" +#include <chrono> #include "AnimatorSystem.h" using namespace crepe; +using namespace std::chrono; void AnimatorSystem::frame_update() { ComponentManager & mgr = this->mediator.component_manager; LoopTimerManager & timer = this->mediator.loop_timer; RefVector<Animator> animations = mgr.get_components_by_type<Animator>(); - unsigned long long elapsed_time = timer.get_elapsed_time().count(); + float elapsed_time = duration_cast<duration<float>>(timer.get_elapsed_time()).count(); for (Animator & a : animations) { if (!a.active) continue; + if (a.data.fps == 0) continue; Animator::Data & ctx = a.data; float frame_duration = 1.0f / ctx.fps; diff --git a/src/test/LoopTimerTest.cpp b/src/test/LoopTimerTest.cpp index d76bf45..7bd6305 100644 --- a/src/test/LoopTimerTest.cpp +++ b/src/test/LoopTimerTest.cpp @@ -30,7 +30,7 @@ TEST_F(LoopTimerTest, EnforcesTargetFrameRate) { auto elapsed_ms = duration_cast<milliseconds>(elapsed_time).count(); // For 60 FPS, the target frame time is around 16.67ms - ASSERT_NEAR(elapsed_ms, 16.7, 1); + ASSERT_NEAR(elapsed_ms, 16.7, 5); } TEST_F(LoopTimerTest, SetTargetFps) { @@ -79,3 +79,19 @@ TEST_F(LoopTimerTest, DISABLED_getCurrentTime) { ASSERT_NEAR(loop_timer.get_elapsed_time().count(), elapsed_time, 5); } +TEST_F(LoopTimerTest, getFPS) { + // Set the target FPS to 60 (which gives a target time per frame of ~16.67 ms) + loop_timer.set_target_framerate(60); + + auto start_time = steady_clock::now(); + loop_timer.enforce_frame_rate(); + + auto elapsed_time = steady_clock::now() - start_time; + loop_timer.update(); + unsigned int fps = loop_timer.get_fps(); + auto elapsed_ms = duration_cast<milliseconds>(elapsed_time).count(); + + // For 60 FPS, the target frame time is around 16.67ms + ASSERT_NEAR(elapsed_ms, 16.7, 1); + ASSERT_NEAR(fps, 60, 2); +} |