implement fps limiter

This commit is contained in:
ohyzha
2024-08-23 17:05:06 +03:00
parent 97bc667e0b
commit f002ea2eca
4 changed files with 40 additions and 4 deletions

View File

@@ -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

View File

@@ -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))
{

View File

@@ -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<IRenderer>(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<IRenderer>(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;

View File

@@ -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);