Avoid duplicated UserInterface::draw calls in RedrawRequested

This commit is contained in:
Héctor Ramón Jiménez 2023-12-19 14:54:27 +01:00
parent 58494bd033
commit e772e5a9e9
No known key found for this signature in database
GPG key ID: 7CC46565708259A7

View file

@ -312,13 +312,13 @@ async fn run_instance<A, E, C>(
while let Some(event) = event_receiver.next().await { while let Some(event) = event_receiver.next().await {
match event { match event {
event::Event::NewEvents(start_cause) => { event::Event::NewEvents(
redraw_pending = matches!( event::StartCause::Init
start_cause, | event::StartCause::Poll
event::StartCause::Init | event::StartCause::ResumeTimeReached { .. },
| event::StartCause::Poll ) if !redraw_pending => {
| event::StartCause::ResumeTimeReached { .. } window.request_redraw();
); redraw_pending = true;
} }
event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( event::Event::PlatformSpecific(event::PlatformSpecific::MacOS(
event::MacOS::ReceivedUrl(url), event::MacOS::ReceivedUrl(url),
@ -338,6 +338,33 @@ async fn run_instance<A, E, C>(
event: event::WindowEvent::RedrawRequested { .. }, event: event::WindowEvent::RedrawRequested { .. },
.. ..
} => { } => {
let physical_size = state.physical_size();
if physical_size.width == 0 || physical_size.height == 0 {
continue;
}
let current_viewport_version = state.viewport_version();
if viewport_version != current_viewport_version {
let logical_size = state.logical_size();
debug.layout_started();
user_interface = ManuallyDrop::new(
ManuallyDrop::into_inner(user_interface)
.relayout(logical_size, &mut renderer),
);
debug.layout_finished();
compositor.configure_surface(
&mut surface,
physical_size.width,
physical_size.height,
);
viewport_version = current_viewport_version;
}
// TODO: Avoid redrawing all the time by forcing widgets to // TODO: Avoid redrawing all the time by forcing widgets to
// request redraws on state changes // request redraws on state changes
// //
@ -379,6 +406,7 @@ async fn run_instance<A, E, C>(
}, },
state.cursor(), state.cursor(),
); );
redraw_pending = false;
debug.draw_finished(); debug.draw_finished();
if new_mouse_interaction != mouse_interaction { if new_mouse_interaction != mouse_interaction {
@ -389,53 +417,7 @@ async fn run_instance<A, E, C>(
mouse_interaction = new_mouse_interaction; mouse_interaction = new_mouse_interaction;
} }
let physical_size = state.physical_size();
if physical_size.width == 0 || physical_size.height == 0 {
continue;
}
debug.render_started(); debug.render_started();
let current_viewport_version = state.viewport_version();
if viewport_version != current_viewport_version {
let logical_size = state.logical_size();
debug.layout_started();
user_interface = ManuallyDrop::new(
ManuallyDrop::into_inner(user_interface)
.relayout(logical_size, &mut renderer),
);
debug.layout_finished();
debug.draw_started();
let new_mouse_interaction = user_interface.draw(
&mut renderer,
state.theme(),
&renderer::Style {
text_color: state.text_color(),
},
state.cursor(),
);
debug.draw_finished();
if new_mouse_interaction != mouse_interaction {
window.set_cursor_icon(conversion::mouse_interaction(
new_mouse_interaction,
));
mouse_interaction = new_mouse_interaction;
}
compositor.configure_surface(
&mut surface,
physical_size.width,
physical_size.height,
);
viewport_version = current_viewport_version;
}
match compositor.present( match compositor.present(
&mut renderer, &mut renderer,
&mut surface, &mut surface,
@ -546,9 +528,10 @@ async fn run_instance<A, E, C>(
} }
} }
window.request_redraw(); if !redraw_pending {
window.request_redraw();
redraw_pending = false; redraw_pending = true;
}
} }
// Manually drop the user interface // Manually drop the user interface