| @@ -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++; | ||||
| } | } | ||||
| } | } | ||||