From 5a0651eaf07c758b571dc6bf06108edfb990f0ea Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sat, 6 Jan 2024 14:38:21 +0100 Subject: [PATCH] wip low fps mode for hidden states and powersave modes. dont use yet, as all compute is still done in the render method --- src/main_screen.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++-- src/main_screen.hpp | 10 ++++-- 2 files changed, 86 insertions(+), 5 deletions(-) diff --git a/src/main_screen.cpp b/src/main_screen.cpp index 5079a24..2bdfcd7 100644 --- a/src/main_screen.cpp +++ b/src/main_screen.cpp @@ -78,6 +78,41 @@ bool MainScreen::handleEvent(SDL_Event& e) { return true; // TODO: forward return succ from sendFilePath() } + if ( + e.type == SDL_EVENT_WINDOW_MINIMIZED || + e.type == SDL_EVENT_WINDOW_HIDDEN || + e.type == SDL_EVENT_WINDOW_OCCLUDED // does this trigger on partial occlusion? + ) { + auto* window = SDL_GetWindowFromID(e.window.windowID); + auto* event_renderer = SDL_GetRenderer(window); + if (event_renderer != nullptr && event_renderer == renderer) { + // our window is now obstructed + if (_window_hidden_ts < e.window.timestamp) { + _window_hidden_ts = e.window.timestamp; + _window_hidden = true; + //std::cout << "TOMAT: window hidden " << e.window.timestamp << "\n"; + } + } + return true; // forward? + } + + if ( + e.type == SDL_EVENT_WINDOW_SHOWN || + e.type == SDL_EVENT_WINDOW_RESTORED || + e.type == SDL_EVENT_WINDOW_EXPOSED + ) { + auto* window = SDL_GetWindowFromID(e.window.windowID); + auto* event_renderer = SDL_GetRenderer(window); + if (event_renderer != nullptr && event_renderer == renderer) { + if (_window_hidden_ts <= e.window.timestamp) { + _window_hidden_ts = e.window.timestamp; + _window_hidden = false; + //std::cout << "TOMAT: window shown " << e.window.timestamp << "\n"; + } + } + return true; // forward? + } + return false; } @@ -115,17 +150,57 @@ Screen* MainScreen::render(float time_delta, bool& quit) { tuiu.render(); tdch.render(); + { // main window menubar injection + if (ImGui::Begin("tomato")) { + if (ImGui::BeginMenuBar()) { + // ImGui::Separator(); // why do we not need this???? + if (ImGui::BeginMenu("Performance")) { + { // fps + const auto targets = "normal\0power save\0"; + ImGui::SetNextItemWidth(ImGui::GetFontSize()*10); + ImGui::Combo("fps mode", &_fps_perf_mode, targets, 4); + } + + { // compute + const auto targets = "normal\0power save\0"; + ImGui::SetNextItemWidth(ImGui::GetFontSize()*10); + ImGui::Combo("compute mode", &_compute_perf_mode, targets, 4); + ImGui::SetItemTooltip("Limiting compute can slow down things filetransfers."); + } + + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + } + ImGui::End(); + } + + if constexpr (false) { ImGui::ShowDemoWindow(); } + if ( + _fps_perf_mode == 1 || // TODO: magic + _window_hidden + ) { + _render_interval = 1.f/4.f; + } else { + _render_interval = 1.f/60.f; + } + return nullptr; } Screen* MainScreen::tick(float time_delta, bool& quit) { - _min_tick_interval = std::min( - tc.toxIterationInterval()/1000.f, - 0.03f // HACK: 30ms upper bound, should be the same as tox but will change + _min_tick_interval = std::max( + std::min( + tc.toxIterationInterval()/1000.f, + 0.03f // HACK: 30ms upper bound, should be the same as tox but will change + ), + (_compute_perf_mode == 0 ? 0.001f : 0.1f) // in powersave fix the lowerbound to 100ms ); return nullptr; diff --git a/src/main_screen.hpp b/src/main_screen.hpp index ed092e8..fb404e6 100644 --- a/src/main_screen.hpp +++ b/src/main_screen.hpp @@ -38,8 +38,6 @@ extern "C" { struct MainScreen final : public Screen { SDL_Renderer* renderer; - std::chrono::high_resolution_clock::time_point last_time = std::chrono::high_resolution_clock::now(); - SimpleConfigModel conf; Contact3Registry cr; RegistryMessageModel rmm; @@ -66,6 +64,9 @@ struct MainScreen final : public Screen { ToxUIUtils tuiu; ToxDHTCapHisto tdch; + bool _window_hidden {false}; + bool _window_hidden_ts {0}; + MainScreen(SDL_Renderer* renderer_, std::string save_path, std::string save_password, std::vector plugins); ~MainScreen(void); @@ -76,6 +77,11 @@ struct MainScreen final : public Screen { Screen* render(float time_delta, bool&) override; Screen* tick(float time_delta, bool&) override; + // 0 - normal + // 1 - power save + int _fps_perf_mode {0}; + int _compute_perf_mode {0}; + float _render_interval {1.f/60.f}; float _min_tick_interval {0.f};