perf(bar): 仅在 bar 需要绘制新内容时才重绘并 flush 后端

This commit is contained in:
2026-06-15 23:27:28 +08:00
parent 41f82d7039
commit 30e9751119
3 changed files with 10 additions and 6 deletions

View File

@@ -302,8 +302,6 @@ static inline bool bar_output_is_dirty(bar_output_t *bar_output) {
}
static void bar_output_draw(bar_output_t *bar_output, text_context_t *ctx) {
if (!bar_output_is_dirty(bar_output)) return;
auto cr = bar_output->cr;
auto left = &bar_output->left;
@@ -318,12 +316,19 @@ static void bar_output_draw(bar_output_t *bar_output, text_context_t *ctx) {
bar_item_draw(cr, &bar_output->center, ctx, bar_output->height);
}
void bar_draw(bar_t *bar) {
bool bar_draw(bar_t *bar) {
auto ctx = bar->ctx;
bool changed = false;
for (size_t i = 0; i < bar->count; ++i) {
auto bar_output = &bar->bars[i];
if (!bar_output_is_dirty(bar_output)) continue;
bar_output_layout(bar_output, ctx);
bar_output_draw(bar_output, ctx);
changed = true;
}
return changed;
}

View File

@@ -41,4 +41,4 @@ typedef struct bar_t {
void bar_init(bar_t *bar, listeners_t *listeners);
void bar_cleanup(bar_t *bar);
void bar_update(bar_t *bar);
void bar_draw(bar_t *bar);
bool bar_draw(bar_t *bar);

View File

@@ -487,8 +487,7 @@ static inline void runtime_update_bar(runtime_t *runtime) {
if (!bar->visible) return;
bar_update(bar);
bar_draw(bar);
backend_flush(runtime->backend);
if (bar_draw(bar)) backend_flush(runtime->backend);
}
static void runtime_run_event_loop(runtime_t *runtime) {