Skip to content

Commit 5e6c42e

Browse files
committed
perf: reduce idle CPU usage by switching to event-driven loop
Replace ControlFlow::Poll with ControlFlow::Wait so the main loop sleeps until a real event arrives. CEF's on_paint and mpv's render update callback now wake the event loop via a shared EventLoopProxy, ensuring redraws still happen on demand. Also reduce the GTK tray poll timer from 16ms to 100ms.
1 parent 40ab9b4 commit 5e6c42e

7 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/app/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ impl ApplicationHandler<UserEvent> for App {
351351
UserEvent::Quit => {
352352
event_loop.exit();
353353
}
354+
UserEvent::Redraw => {}
354355
}
355356
}
356357
}

src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,10 @@ fn main() -> ExitCode {
8282
.build()
8383
.expect("Failed to create event loop");
8484

85-
event_loop.set_control_flow(ControlFlow::Poll);
85+
event_loop.set_control_flow(ControlFlow::Wait);
8686

8787
let event_loop_proxy = event_loop.create_proxy();
88+
shared::EVENT_LOOP_PROXY.set(event_loop_proxy.clone()).ok();
8889

8990
let mut needs_redraw = false;
9091

src/player/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ impl Player {
212212
let sender = self.sender.clone();
213213
render_context.set_update_callback(move || {
214214
sender.send(PlayerEvent::Update).ok();
215+
crate::shared::wake_event_loop();
215216
});
216217

217218
self.render_context = Some(render_context);

src/shared/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ use std::{
66
sync::{Mutex, RwLock},
77
};
88

9+
use once_cell::sync::OnceCell;
10+
use winit::event_loop::EventLoopProxy;
11+
12+
use self::types::UserEvent;
13+
14+
pub static EVENT_LOOP_PROXY: OnceCell<EventLoopProxy<UserEvent>> = OnceCell::new();
15+
16+
pub fn wake_event_loop() {
17+
if let Some(proxy) = EVENT_LOOP_PROXY.get() {
18+
proxy.send_event(UserEvent::Redraw).ok();
19+
}
20+
}
21+
922
use glutin::{
1023
context::{NotCurrentContext, PossiblyCurrentContext},
1124
prelude::{NotCurrentGlContext, PossiblyCurrentGlContext},

src/shared/types.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ pub enum UserEvent {
4747
Show,
4848
Hide,
4949
Quit,
50+
Redraw,
5051
}

src/tray.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl Tray {
4040
let menu = Self::create_menu();
4141
let tray = Self::create(menu, config);
4242

43-
glib::timeout_add_local(Duration::from_millis(16), move || {
43+
glib::timeout_add_local(Duration::from_millis(100), move || {
4444
tray_receiver.try_iter().for_each(|event| match event {
4545
TrayEvent::Visibility(state) => {
4646
let menu = Self::create_menu();

src/webview/app/client/render_handler.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ cef_impl!(
5555

5656
if let Some(sender) = SENDER.get() {
5757
sender.send(WebViewEvent::Paint).ok();
58+
crate::shared::wake_event_loop();
5859
}
5960
} else if let Some(sender) = SENDER.get() {
6061
sender.send(WebViewEvent::Resized).ok();

0 commit comments

Comments
 (0)