From f002ea2ecaf77b8283f1b71648db3a6572134640 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Fri, 23 Aug 2024 17:05:06 +0300 Subject: [PATCH] implement fps limiter --- openVulkanoCpp/Base/EngineConfiguration.hpp | 2 +- .../Controller/FreeCamCameraController.cpp | 2 +- openVulkanoCpp/Host/GraphicsAppManager.cpp | 29 ++++++++++++++++++- openVulkanoCpp/Host/GraphicsAppManager.hpp | 11 ++++++- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/openVulkanoCpp/Base/EngineConfiguration.hpp b/openVulkanoCpp/Base/EngineConfiguration.hpp index 27f299f..347fec7 100644 --- a/openVulkanoCpp/Base/EngineConfiguration.hpp +++ b/openVulkanoCpp/Base/EngineConfiguration.hpp @@ -48,7 +48,7 @@ namespace OpenVulkano bool m_preferFramebufferFormatSRGB = true; bool m_lazyRendering = false; bool m_vSync = false; - int32_t m_fpsCap = -1; // -1 = no fps cap. 0 = fps cap if vsync, no cap otherwise. > 0 = set fps cap + int32_t m_fpsCap = 500; // -1 = no fps cap. 0 = fps cap if vsync, no cap otherwise. > 0 = set fps cap #ifdef __APPLE__ uint32_t m_preferredImageCount = 3; #else diff --git a/openVulkanoCpp/Controller/FreeCamCameraController.cpp b/openVulkanoCpp/Controller/FreeCamCameraController.cpp index 71da9cc..8f94d3e 100644 --- a/openVulkanoCpp/Controller/FreeCamCameraController.cpp +++ b/openVulkanoCpp/Controller/FreeCamCameraController.cpp @@ -32,7 +32,7 @@ namespace OpenVulkano vec = Math::Utils::normalize(vec); } - float timeScale = 5 * CURRENT_FRAME.frameTime; //TODO + float timeScale = 3 * CURRENT_FRAME.frameTime; //TODO vec = vec * timeScale * 3.0f; // scale vector if (input->GetButton(m_actionBoost)) { diff --git a/openVulkanoCpp/Host/GraphicsAppManager.cpp b/openVulkanoCpp/Host/GraphicsAppManager.cpp index f9cd1bb..6d29b66 100644 --- a/openVulkanoCpp/Host/GraphicsAppManager.cpp +++ b/openVulkanoCpp/Host/GraphicsAppManager.cpp @@ -19,6 +19,8 @@ namespace OpenVulkano { + using clock = std::chrono::steady_clock; + GraphicsAppManager::GraphicsAppManager(OpenVulkano::IGraphicsApp* app, RenderAPI::RenderApi renderApi) : app(app), renderApi(renderApi) { @@ -37,6 +39,8 @@ namespace OpenVulkano renderer = std::unique_ptr(PlatformProducer::CreateRenderManager(renderApi)); app->SetGraphicsAppManager(this); window->SetWindowHandler(this); + inputManager = Input::InputManager::GetInstance(); + engineConfig = EngineConfiguration::GetEngineConfiguration(); } GraphicsAppManager::GraphicsAppManager(IGraphicsApp* app, IWindow* window, RenderAPI::RenderApi renderApi) @@ -57,6 +61,24 @@ namespace OpenVulkano renderer = std::unique_ptr(PlatformProducer::CreateRenderManager(renderApi)); app->SetGraphicsAppManager(this); window->SetWindowHandler(this); + inputManager = OpenVulkano::Input::InputManager::GetInstance(); + engineConfig = OpenVulkano::EngineConfiguration::GetEngineConfiguration(); + } + + void GraphicsAppManager::OnCappedFPS(const auto& frameStartTime) + { + int32_t fpsCap = engineConfig->GetFpsCap(); + fpsCapRemainder += 1000 % fpsCap; + auto frameTime = std::chrono::milliseconds(1000 / fpsCap); + if (fpsCapRemainder >= fpsCap) + { + frameTime += std::chrono::milliseconds(1); + fpsCapRemainder -= fpsCap; + } + while (clock::now() < frameStartTime + frameTime) + { + std::this_thread::yield(); + } } GraphicsAppManager::~GraphicsAppManager() noexcept @@ -139,9 +161,14 @@ namespace OpenVulkano } else { - Input::InputManager::GetInstance()->Tick(); + auto start = clock::now(); + inputManager->Tick(); app->Tick(); if (CURRENT_FRAME.needsRedraw) renderer->Tick(); + if (engineConfig->GetFpsCap() > 0 && !engineConfig->GetVSync()) + { + OnCappedFPS(start); + } frameTimer.Tick(); UpdateFps(); CURRENT_FRAME.frameId = frameCount; diff --git a/openVulkanoCpp/Host/GraphicsAppManager.hpp b/openVulkanoCpp/Host/GraphicsAppManager.hpp index 5d4b627..d264e1b 100644 --- a/openVulkanoCpp/Host/GraphicsAppManager.hpp +++ b/openVulkanoCpp/Host/GraphicsAppManager.hpp @@ -18,6 +18,11 @@ namespace OpenVulkano { class IPlatform; + namespace Input + { + class InputManager; + } + class EngineConfiguration; /** * \brief A simple GraphicsAppManager. It can only handle one window. @@ -32,10 +37,14 @@ namespace OpenVulkano RenderAPI::RenderApi renderApi; bool paused = false, running = false; float fpsTimer = 0, avgFps = 0, avgFrameTime = 0; - uint64_t frameCount = 0, lastFrameCount = 0; + uint64_t frameCount = 0, lastFrameCount = 0, fpsCapRemainder = 0; Timer frameTimer; std::string windowTitleFormat; + Input::InputManager* inputManager; + EngineConfiguration* engineConfig; + private: + void OnCappedFPS(const auto& frameStartTime); public: explicit GraphicsAppManager(IGraphicsApp* app, RenderAPI::RenderApi renderApi = RenderAPI::Vulkan);