From de60d3004389c1a2835dc54ee52208a8750d754e Mon Sep 17 00:00:00 2001 From: SArpnt <36542932+SArpnt@users.noreply.github.com> Date: Sat, 10 Apr 2021 10:08:55 -0400 Subject: [PATCH] better time class, switched floats to doubles, removed vsync, added framerate cap --- engine/core/module.h | 8 ++--- engine/core/time.cpp | 29 ++++++++++----- engine/core/time.h | 13 +++---- engine/main.cpp | 58 +++++++++++++++--------------- engine/managers/module_manager.cpp | 6 ++-- engine/managers/module_manager.h | 2 +- engine/math/transform.h | 1 - engine/rendering/camera.h | 5 ++- engine/rendering/render_engine.h | 2 +- 9 files changed, 66 insertions(+), 58 deletions(-) diff --git a/engine/core/module.h b/engine/core/module.h index ba4522dc..7fe4773f 100644 --- a/engine/core/module.h +++ b/engine/core/module.h @@ -8,11 +8,11 @@ namespace ce { class Module { private: public: - virtual void tick(float deltaTime) = 0; + virtual void tick(double deltaTime) = 0; }; typedef Module* init_module_t(); typedef void delete_module_t(Module*); } -#define CE_MODULE(X) \ - extern "C" ce::Module* init_module() { return new X; } \ - extern "C" void delete_module(ce::Module* m) { delete m; } \ No newline at end of file +#define CE_MODULE(CLASS) \ + extern "C" ce::Module* init_module() { return new CLASS; } \ + extern "C" void delete_module(ce::Module* m) { delete m; } diff --git a/engine/core/time.cpp b/engine/core/time.cpp index 3627a0a0..7857c6fc 100644 --- a/engine/core/time.cpp +++ b/engine/core/time.cpp @@ -1,18 +1,29 @@ #include "time.h" -#include +#include -float ce::Time::getTime() { - return SDL_GetTicks() / 1000.0f; -} ce::Time::Time() - : m_last(getTime()), m_now(0), m_dt(0), m_fps(0) {} + : m_dt(0), m_fps(0) { + update(false, false); +} ce::Time::~Time() {} -void ce::Time::update() { - m_now = getTime(); - m_dt = m_now - m_last; - m_fps = 1 / m_dt; +void ce::Time::recalculate(bool dt, bool fps) { + m_now = SDL_GetPerformanceCounter(); + if (dt) + m_dt = (m_now - m_last) / (double)SDL_GetPerformanceFrequency(); + if (fps) + m_fps = (double)SDL_GetPerformanceFrequency() / (m_now - m_last); +} + +void ce::Time::update(bool dt, bool fps) { + recalculate(dt, fps); m_last = m_now; +} + +void ce::Time::waitUntilDelta(double dt) { + do + recalculate(true, false); + while (m_dt < dt); } \ No newline at end of file diff --git a/engine/core/time.h b/engine/core/time.h index b3b67c7e..006722ff 100644 --- a/engine/core/time.h +++ b/engine/core/time.h @@ -3,17 +3,18 @@ namespace ce { class Time { private: - float m_now, m_last, m_dt, m_fps; - - float getTime(); + unsigned long m_now, m_last; + double m_dt, m_fps; public: Time(); ~Time(); - void update(); + void recalculate(bool dt = true, bool fps = true); + void update(bool dt = true, bool fps = true); + void waitUntilDelta(double dt); - float getDeltaTime() { return m_dt; } - float getFPS() { return m_fps; }; + double getDeltaTime() { return m_dt; } + double getFPS() { return m_fps; }; }; } diff --git a/engine/main.cpp b/engine/main.cpp index b654528d..7893df6e 100644 --- a/engine/main.cpp +++ b/engine/main.cpp @@ -94,6 +94,7 @@ int main(int argc, char* argv[]) { ce::Time* time = new ce::Time(); ce::Window* window = new ce::Window("Cinnabar"); + SDL_GL_SetSwapInterval(0); // disable vsync ce::RenderEngine* renderEngine = new ce::RenderEngine(); renderEngine->setFOV(75.0f); @@ -117,7 +118,8 @@ int main(int argc, char* argv[]) { ce::Transform* blenderPos = new ce::Transform(); ce::Material* blenderMaterial = new ce::Material("vertColor"); - float mouseSens = 0.25f; + double mouseSens = 0.05; + double deltaTimeMin = 1.0 / 1000.0; // framerate cap ce::Camera* camera = new ce::Camera(); // TODO: Seperate so i can put in a player class later glm::vec3 cameraVelocity(0.0f); @@ -128,9 +130,10 @@ int main(int argc, char* argv[]) { * Game Loop */ SDL_Event event; - int running = 1; + bool running = true; while (running) { time->update(); + std::cout << time->getFPS() << std::endl; while (SDL_PollEvent(&event)) { switch (event.type) { @@ -149,37 +152,29 @@ int main(int argc, char* argv[]) { break; } case SDL_KEYDOWN: { - float cameraSpeed = 2.5f * time->getDeltaTime(); - if (event.key.keysym.sym == SDLK_w) - cameraVelocity.z = cameraSpeed; - else if (event.key.keysym.sym == SDLK_s) - cameraVelocity.z = -cameraSpeed; - if (event.key.keysym.sym == SDLK_a) - cameraVelocity.x = -cameraSpeed; - else if (event.key.keysym.sym == SDLK_d) - cameraVelocity.x = cameraSpeed; - if (event.key.keysym.sym == SDLK_SPACE) - cameraVelocity.y = cameraSpeed; - else if (event.key.keysym.sym == SDLK_LSHIFT) - cameraVelocity.y = -cameraSpeed; - if (event.key.keysym.sym == SDLK_ESCAPE) - window->setMouseVisibility(true); + double cameraSpeed = 2.5 * time->getDeltaTime(); + switch (event.key.keysym.sym) { + case SDLK_w: cameraVelocity.z = cameraSpeed; break; + case SDLK_s: cameraVelocity.z = -cameraSpeed; break; + case SDLK_d: cameraVelocity.x = cameraSpeed; break; + case SDLK_a: cameraVelocity.x = -cameraSpeed; break; + case SDLK_SPACE: cameraVelocity.y = cameraSpeed; break; + case SDLK_LSHIFT: cameraVelocity.y = -cameraSpeed; break; + + case SDLK_ESCAPE: window->setMouseVisibility(true); break; + } break; } case SDL_KEYUP: { - if ((event.key.keysym.sym == SDLK_w && cameraVelocity.z > 0) || - (event.key.keysym.sym == SDLK_s && cameraVelocity.z < 0)) - cameraVelocity.z = 0; - if ((event.key.keysym.sym == SDLK_a && cameraVelocity.x < 0) || - (event.key.keysym.sym == SDLK_d && cameraVelocity.x > 0)) - cameraVelocity.x = 0; - if ((event.key.keysym.sym == SDLK_SPACE && cameraVelocity.y > 0) || - (event.key.keysym.sym == SDLK_LSHIFT && cameraVelocity.y < 0)) - cameraVelocity.y = 0; + switch (event.key.keysym.sym) { // note that this movement is terrible and should absolutely not be used in a proper engine + case SDLK_w: case SDLK_s: cameraVelocity.z = 0; break; + case SDLK_d: case SDLK_a: cameraVelocity.x = 0; break; + case SDLK_SPACE: case SDLK_LSHIFT: cameraVelocity.y = 0; break; + } break; } case SDL_QUIT: { - running = 0; + running = false; break; } case SDL_WINDOWEVENT: { @@ -192,9 +187,9 @@ int main(int argc, char* argv[]) { moduleManager->tickModules(time->getDeltaTime()); // Rotate cube - cubePos->roll(25.0f * time->getDeltaTime()); - cubePos->yaw(50.0f * time->getDeltaTime()); - cubePos->pitch(100.0f * time->getDeltaTime()); + cubePos->roll(25.0 * time->getDeltaTime()); + cubePos->yaw(50.0 * time->getDeltaTime()); + cubePos->pitch(100.0 * time->getDeltaTime()); // Move camera glm::vec3 @@ -213,6 +208,9 @@ int main(int argc, char* argv[]) { renderEngine->render(); window->swapBuffers(); + + // framerate cap + time->waitUntilDelta(deltaTimeMin); } delete cubeMesh; delete cubeMaterial; diff --git a/engine/managers/module_manager.cpp b/engine/managers/module_manager.cpp index a22bbc75..1db940e3 100644 --- a/engine/managers/module_manager.cpp +++ b/engine/managers/module_manager.cpp @@ -18,7 +18,7 @@ void ce::ModuleManger::loadModules() { LOG_ERROR(dlerror()); continue; } - //reset Errors + // reset errors dlerror(); const char* error; LOG_INFO("Loading Symbols for: " + path); @@ -57,7 +57,7 @@ ce::ModuleManger::~ModuleManger() { } } -void ce::ModuleManger::tickModules(float deltaTime) { +void ce::ModuleManger::tickModules(double deltaTime) { for (int i = 0; i < m_modules.size(); i++) m_modules[i].module->tick(deltaTime); -} +} \ No newline at end of file diff --git a/engine/managers/module_manager.h b/engine/managers/module_manager.h index 1ec6d43d..52e817d3 100644 --- a/engine/managers/module_manager.h +++ b/engine/managers/module_manager.h @@ -25,6 +25,6 @@ namespace ce { ModuleManger(); ~ModuleManger(); - void tickModules(float deltaTime); + void tickModules(double deltaTime); }; } \ No newline at end of file diff --git a/engine/math/transform.h b/engine/math/transform.h index 6237039a..bdf6e982 100644 --- a/engine/math/transform.h +++ b/engine/math/transform.h @@ -10,7 +10,6 @@ namespace ce { * Pitch:X * Yaw:Y * Roll: Z - * */ glm::vec3 m_pos, m_rot, m_scale; diff --git a/engine/rendering/camera.h b/engine/rendering/camera.h index 23c6437c..4bdbf6a5 100644 --- a/engine/rendering/camera.h +++ b/engine/rendering/camera.h @@ -7,9 +7,8 @@ namespace ce { class Camera { private: ce::Transform* m_transform; - float - speed, - fov; + double speed; + float fov; public: Camera(); diff --git a/engine/rendering/render_engine.h b/engine/rendering/render_engine.h index a913c328..5dc73f8d 100644 --- a/engine/rendering/render_engine.h +++ b/engine/rendering/render_engine.h @@ -17,7 +17,7 @@ namespace ce { class RenderEngine { private: - float m_aspectRatio, m_fov, m_near, m_far; + double m_aspectRatio, m_fov, m_near, m_far; Camera* m_camera;