fix: Remove unnecessary frame drawing actions

This commit is contained in:
DreamMaoMao 2025-02-17 17:55:44 +08:00
parent 2a85b2f0b9
commit 13f4ade7bf

View file

@ -227,7 +227,7 @@ typedef struct {
bool is_open_animation; bool is_open_animation;
bool is_restoring_from_ov; bool is_restoring_from_ov;
float scroller_proportion; float scroller_proportion;
bool need_set_position;
struct dwl_animation animation; struct dwl_animation animation;
} Client; } Client;
@ -874,19 +874,22 @@ void client_apply_clip(Client *c) {
bool client_draw_frame(Client *c) { bool client_draw_frame(Client *c) {
if (!c || !client_surface(c)->mapped) if (!c || !client_surface(c)->mapped)
return false; return false;
// if (!VISIBLEON(c, c->mon))
// return false; if (!c->need_set_position)
return false;
bool need_more_frames = false; bool need_more_frames = false;
if (c->animation.running) { if (c->animation.running) {
if (client_animation_next_tick(c)) { if (client_animation_next_tick(c)) {
need_more_frames = true; need_more_frames = true;
} }
client_apply_clip(c);
} else { } else {
wlr_scene_node_set_position(&c->scene->node, c->pending.x, c->pending.y); wlr_scene_node_set_position(&c->scene->node, c->pending.x, c->pending.y);
apply_border(c, c->pending, 0); apply_border(c, c->pending, 0);
}
client_apply_clip(c); client_apply_clip(c);
c->need_set_position = false;
}
return need_more_frames; return need_more_frames;
} }
@ -3638,6 +3641,14 @@ rendermon(struct wl_listener *listener, void *data) {
struct timespec now; struct timespec now;
bool need_more_frames = false; bool need_more_frames = false;
wl_list_for_each(c, &clients, link) {
need_more_frames = client_draw_frame(c);
}
if (need_more_frames) {
wlr_output_schedule_frame(m->wlr_output);
}
/* Render if no XDG clients have an outstanding resize and are visible on /* Render if no XDG clients have an outstanding resize and are visible on
* this monitor. */ * this monitor. */
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
@ -3646,13 +3657,6 @@ rendermon(struct wl_listener *listener, void *data) {
goto skip; goto skip;
} }
wl_list_for_each(c, &clients, link) {
need_more_frames = client_draw_frame(c);
}
if (need_more_frames) {
wlr_output_schedule_frame(m->wlr_output);
}
/* /*
* HACK: The "correct" way to set the gamma is to commit it together with * HACK: The "correct" way to set the gamma is to commit it together with
@ -3681,12 +3685,12 @@ rendermon(struct wl_listener *listener, void *data) {
wlr_scene_output_commit(m->scene_output, NULL); wlr_scene_output_commit(m->scene_output, NULL);
} }
skip:
struct wlr_scene_output *scene_output = struct wlr_scene_output *scene_output =
wlr_scene_get_scene_output(scene, m->wlr_output); wlr_scene_get_scene_output(scene, m->wlr_output);
wlr_scene_output_commit(scene_output, NULL); wlr_scene_output_commit(scene_output, NULL);
skip:
clock_gettime(CLOCK_MONOTONIC, &now); clock_gettime(CLOCK_MONOTONIC, &now);
wlr_scene_output_send_frame_done(scene_output, &now); wlr_scene_output_send_frame_done(scene_output, &now);
wlr_output_state_finish(&pending); wlr_output_state_finish(&pending);
@ -3901,6 +3905,8 @@ void resize(Client *c, struct wlr_box geo, int interact) {
if (!c->mon) if (!c->mon)
return; return;
c->need_set_position = true;
// oldgeom = c->geom; // oldgeom = c->geom;
bbox = interact ? &sgeom : &c->mon->w; bbox = interact ? &sgeom : &c->mon->w;