diff --git a/main.cpp b/main.cpp index 6f16eb1..75f44a4 100644 --- a/main.cpp +++ b/main.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #if defined(IMGUI_IMPL_OPENGL_ES2) #include #else @@ -202,6 +203,7 @@ int main(int, char**) bool theme_editor = false; bool stopped = true; bool vsync = false; + int framerate = 60; { Json::Value config; std::ifstream stream; @@ -224,6 +226,9 @@ int main(int, char**) if (config.isMember("vsync")) { vsync = config["vsync"].asBool(); } + if (config.isMember("framerate")) { + framerate = config["framerate"].asUInt(); + } stream.close(); } if (is_empty(Theme::themeDir)) { @@ -262,6 +267,7 @@ int main(int, char**) SDL_SetWindowMinimumSize(window, 475, min_y); } }*/ + auto next_frame = std::chrono::steady_clock::now() + std::chrono::milliseconds(1000 / framerate); position = playback->GetPosition(); // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. @@ -377,6 +383,9 @@ int main(int, char**) if (ImGui::Checkbox("Enable VSync", &vsync)) { SDL_GL_SetSwapInterval(vsync ? 1 : 0); } + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetWindowWidth() - ImGui::GetCursorPosX() - ImGui::GetStyle().WindowPadding.x); + ImGui::SliderInt("##Framerate", &framerate, 10, 480, "Max framerate without VSync: %d"); if (ImGui::Button(ICON_FK_MAGIC "Theme Editor", ImVec2(ImGui::GetWindowWidth() - (ImGui::GetStyle().WindowPadding.x * 2.0f), 0))) { theme_editor = true; } @@ -463,6 +472,9 @@ int main(int, char**) } SDL_GL_SwapWindow(window); + if (!vsync) { + std::this_thread::sleep_until(next_frame); + } } // Cleanup #ifdef __EMSCRIPTEN__ @@ -491,6 +503,7 @@ int main(int, char**) config["accent_color"] = accent_color; config["demo_window"] = show_demo_window; config["vsync"] = vsync; + config["framerate"] = framerate; stream << config; stream.close(); }