@@ -18,6 +18,7 @@ extern bool powerMeter; | |||||
extern bool lockModules; | extern bool lockModules; | ||||
extern bool checkVersion; | extern bool checkVersion; | ||||
extern bool skipLoadOnLaunch; | extern bool skipLoadOnLaunch; | ||||
extern float frameRateLimit; | |||||
} // namespace settings | } // namespace settings | ||||
@@ -77,6 +77,9 @@ static json_t *settingsToJson() { | |||||
// paramTooltip | // paramTooltip | ||||
json_object_set_new(rootJ, "paramTooltip", json_boolean(paramTooltip)); | json_object_set_new(rootJ, "paramTooltip", json_boolean(paramTooltip)); | ||||
// frameRateLimit | |||||
json_object_set_new(rootJ, "frameRateLimit", json_real(frameRateLimit)); | |||||
return rootJ; | return rootJ; | ||||
} | } | ||||
@@ -163,6 +166,11 @@ static void settingsFromJson(json_t *rootJ) { | |||||
json_t *paramTooltipJ = json_object_get(rootJ, "paramTooltip"); | json_t *paramTooltipJ = json_object_get(rootJ, "paramTooltip"); | ||||
if (paramTooltipJ) | if (paramTooltipJ) | ||||
paramTooltip = json_boolean_value(paramTooltipJ); | paramTooltip = json_boolean_value(paramTooltipJ); | ||||
// frameRateLimit | |||||
json_t *frameRateLimitJ = json_object_get(rootJ, "frameRateLimit"); | |||||
if (frameRateLimitJ) | |||||
frameRateLimit = json_number_value(frameRateLimitJ); | |||||
} | } | ||||
@@ -208,6 +216,7 @@ bool powerMeter = false; | |||||
bool lockModules = false; | bool lockModules = false; | ||||
bool checkVersion = true; | bool checkVersion = true; | ||||
bool skipLoadOnLaunch = false; | bool skipLoadOnLaunch = false; | ||||
float frameRateLimit = 0.0; | |||||
} // namespace settings | } // namespace settings | ||||
@@ -6,6 +6,7 @@ | |||||
#include "event.hpp" | #include "event.hpp" | ||||
#include "app.hpp" | #include "app.hpp" | ||||
#include "patch.hpp" | #include "patch.hpp" | ||||
#include "settings.hpp" | |||||
#include <map> | #include <map> | ||||
#include <queue> | #include <queue> | ||||
@@ -221,6 +222,7 @@ Window::Window() { | |||||
glfwSetInputMode(win, GLFW_LOCK_KEY_MODS, 1); | glfwSetInputMode(win, GLFW_LOCK_KEY_MODS, 1); | ||||
glfwMakeContextCurrent(win); | glfwMakeContextCurrent(win); | ||||
// Enable v-sync | |||||
glfwSwapInterval(1); | glfwSwapInterval(1); | ||||
glfwSetWindowSizeCallback(win, windowSizeCallback); | glfwSetWindowSizeCallback(win, windowSizeCallback); | ||||
@@ -371,15 +373,18 @@ void Window::run() { | |||||
glfwSwapBuffers(win); | glfwSwapBuffers(win); | ||||
} | } | ||||
// Limit framerate manually if vsync isn't working | |||||
// Limit frame rate | |||||
double endTime = glfwGetTime(); | double endTime = glfwGetTime(); | ||||
double frameTime = endTime - startTime; | |||||
double minTime = 1 / 120.0; | |||||
if (frameTime < minTime) { | |||||
std::this_thread::sleep_for(std::chrono::duration<double>(minTime - frameTime)); | |||||
if (settings::frameRateLimit > 0.0) { | |||||
double frameDuration = endTime - startTime; | |||||
double waitDuration = 1.0 / settings::frameRateLimit - frameDuration; | |||||
if (waitDuration > 0.0) { | |||||
std::this_thread::sleep_for(std::chrono::duration<double>(waitDuration)); | |||||
} | |||||
} | } | ||||
// Compute actual frame rate | |||||
endTime = glfwGetTime(); | endTime = glfwGetTime(); | ||||
// INFO("%lf fps", 1.0 / (endTime - startTime)); | |||||
frame++; | frame++; | ||||
} | } | ||||
} | } | ||||