diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-12-07 21:10:18 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-12-07 21:10:18 +0800 |
| commit | f16bfe4b1acf1718aeaff311ed23278834a8a17b (patch) | |
| tree | 8d05798ed1c0ebca10e43d5dc9d966aa0bd24289 | |
| parent | b3b68c704926b71afc923f392b0cc91107717112 (diff) | |
| download | cru-f16bfe4b1acf1718aeaff311ed23278834a8a17b.tar.gz cru-f16bfe4b1acf1718aeaff311ed23278834a8a17b.tar.bz2 cru-f16bfe4b1acf1718aeaff311ed23278834a8a17b.zip | |
Lower timer priority (including rendering) in SDL.
| -rw-r--r-- | include/cru/base/Timer.h | 16 | ||||
| -rw-r--r-- | src/platform/gui/sdl/UiApplication.cpp | 33 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 2 |
3 files changed, 31 insertions, 20 deletions
diff --git a/include/cru/base/Timer.h b/include/cru/base/Timer.h index 5508bccf..52c8386d 100644 --- a/include/cru/base/Timer.h +++ b/include/cru/base/Timer.h @@ -30,19 +30,23 @@ class TimerRegistry : public Object { repeat(repeat), data(std::move(data)) {} + std::chrono::steady_clock::time_point NextTrigger() const { + return interval == std::chrono::milliseconds::zero() + ? last_check + : last_check - (last_check - created) % interval + interval; + } + std::chrono::milliseconds NextTimeout( std::chrono::steady_clock::time_point now) const { - return interval == std::chrono::milliseconds::zero() + auto next_trigger = NextTrigger(); + return now >= next_trigger ? std::chrono::milliseconds::zero() : std::chrono::duration_cast<std::chrono::milliseconds>( - interval - (now - created) % interval); + next_trigger - now); } bool Update(std::chrono::steady_clock::time_point now) { - auto next_trigger = - interval == std::chrono::milliseconds::zero() - ? last_check - : last_check - (last_check - created) % interval + interval; + auto next_trigger = NextTrigger(); if (now >= next_trigger) { last_check = next_trigger; return true; diff --git a/src/platform/gui/sdl/UiApplication.cpp b/src/platform/gui/sdl/UiApplication.cpp index edf1e20c..4bcfc5a5 100644 --- a/src/platform/gui/sdl/UiApplication.cpp +++ b/src/platform/gui/sdl/UiApplication.cpp @@ -47,29 +47,36 @@ SdlUiApplication::~SdlUiApplication() { int SdlUiApplication::Run() { while (true) { - if (auto result = timers_.Update(std::chrono::steady_clock::now())) { - result->data(); - continue; - } - auto timeout = timers_.NextTimeout(std::chrono::steady_clock::now()); SDL_Event event; + bool has_event = false; if (timeout) { - SDL_WaitEventTimeout(&event, timeout->count()); + if (*timeout == std::chrono::milliseconds::zero()) { + has_event = SDL_PollEvent(&event); + } else { + has_event = SDL_WaitEventTimeout(&event, timeout->count()); + } } else { CheckSdlReturn(SDL_WaitEvent(&event)); + has_event = true; } - if (event.type == SDL_EVENT_QUIT) { - break; - } + if (has_event) { + if (event.type == SDL_EVENT_QUIT) { + break; + } - // char buf[512]; - // SDL_GetEventDescription(&event, buf, sizeof(buf) / sizeof(*buf)); - // CruLogDebug(kLogTag, "{}", buf); + // char buf[512]; + // SDL_GetEventDescription(&event, buf, sizeof(buf) / sizeof(*buf)); + // CruLogDebug(kLogTag, "{}", buf); - DispatchEvent(event); + DispatchEvent(event); + } else { + if (auto result = timers_.Update(std::chrono::steady_clock::now())) { + result->data(); + } + } delete_later_pool_.Clean(); } diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp index 35d33172..44860ae3 100644 --- a/src/platform/gui/sdl/Window.cpp +++ b/src/platform/gui/sdl/Window.cpp @@ -280,7 +280,7 @@ void SdlWindow::DoCreateWindow() { client_rect_.top)); } - if (!IsWayland() || !sdl_is_popup_) { + if (!sdl_is_popup_) { CheckSdlReturn(SDL_SetWindowParent( sdl_window_, parent_ == nullptr ? nullptr : parent_->sdl_window_)); } |
