mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-02 19:02:00 +00:00
perf(l2): no redraws while nothing changes
Found by counting flushes on idle screens in the sim: - The compose field's cursor blinked (a redraw every 400 ms) as soon as a conversation opened, the keyboard hidden: lv_keyboard_set_textarea() focuses the field, and LVGL only stops a blink when the cursor moves. fieldFocus() sets the state and nudges the blink; also used for the WiFi and channel fields, which left theirs running. - lv_obj_align_to() restyles on every call, so the status bar's icons redrew every second; placeLeftOf() moves them only when they move. - Text colours set every second (nav bar, GPS status, Diag errors) go through setTextColor(), which skips an unchanged colour. - A LV_LABEL_LONG_DOT label writes its "..." into its own text, so setText() never matched and rewrote it every refresh (the nav bar's hint); labelShows() reads past the dots. - The map area, the area-outline, trail and vector-label layers were invalidated on every map refresh (every 3 s, a full-map redraw); now only when the view or what they draw changed. Idle map: 17 -> 1 flush in 5 s; list and settings screens: 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -118,8 +118,12 @@ static void clear() {
|
||||
// Places the labels for a view (world px of its top-left at zoom z, size;
|
||||
// `bottom` px taken by a bar along the bottom).
|
||||
static void layout(double left, double top, int w, int h, int z, bool on, int bottom) {
|
||||
int had = s_n;
|
||||
clear();
|
||||
if (!on || z < 10 || !s_layer || !s_placed || !s_cand) { if (s_layer) lv_obj_invalidate(s_layer); return; }
|
||||
if (!on || z < 10 || !s_layer || !s_placed || !s_cand) { // none: those shown go (none shown, nothing to redraw)
|
||||
if (s_layer && had) lv_obj_invalidate(s_layer);
|
||||
return;
|
||||
}
|
||||
int dz = z >= 14 ? 14 : z >= 12 ? 12 : 10, k = z - dz;
|
||||
double span = (double)(TILE_PX << k); // a data tile, in px at zoom z
|
||||
int x0 = (int)floor(left / span), x1 = (int)floor((left + w) / span);
|
||||
|
||||
Reference in New Issue
Block a user