1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:38:11 +00:00

LibWeb: Paint page only if something that requires repaint happened

Resolves a performance regression from
8ba18dfd40, where moving paint scheduling
to `EventLoop::process()` led to unnecessary repaints.

This update introduces a flag to trigger repaints only when necessary,
addressing the issue where repaints previously occurred with each event
loop process, irrespective of actual changes.
This commit is contained in:
Aliaksandr Kalenik 2024-02-23 22:10:35 +01:00 committed by Andreas Kling
parent 906ac71eca
commit c3f5dbb101
4 changed files with 15 additions and 4 deletions

View file

@ -1980,12 +1980,14 @@ void Navigable::set_viewport_rect(CSSPixelRect const& rect)
document->set_needs_layout();
}
did_change = true;
m_needs_repaint = true;
}
if (m_viewport_scroll_offset != rect.location()) {
m_viewport_scroll_offset = rect.location();
scroll_offset_did_change();
did_change = true;
m_needs_repaint = true;
}
if (did_change && active_document()) {
@ -2036,6 +2038,8 @@ void Navigable::set_needs_display(CSSPixelRect const& rect)
// FIXME: Ignore updates outside the visible viewport rect.
// This requires accounting for fixed-position elements in the input rect, which we don't do yet.
m_needs_repaint = true;
if (is<TraversableNavigable>(*this)) {
static_cast<TraversableNavigable*>(this)->page().client().page_did_invalidate(to_top_level_rect(rect));
return;
@ -2128,6 +2132,8 @@ void Navigable::paint(Painting::RecordingPainter& recording_painter, PaintConfig
}
recording_painter.commands_list().apply_scroll_offsets(scroll_offsets_by_frame_id);
}
m_needs_repaint = false;
}
// https://html.spec.whatwg.org/multipage/browsing-the-web.html#event-uni