Skip to content

Commit 3a61b8d

Browse files
committed
Optimize VNC screen update to reduce delays
Previously, the VNC renderer fed the damaged region to the buffer line by line, resulting in significant rendering delays due to frequent buffer updates. The implementation has been optimized to aggregate all updates during the current screen refresh cycle. The buffer is now updated once per refresh with the complete damaged region, reducing rendering delays and preventing screen tearing. Close #81
1 parent 63f97af commit 3a61b8d

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

backend/vnc.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,8 @@ static void _twin_vnc_put_span(twin_coord_t left,
7575
size_t span_width = right - left;
7676

7777
memcpy(fb_pixels, pixels, span_width * sizeof(*fb_pixels));
78-
79-
pixman_region_init_rect(&tx->damage_region, left, top, span_width, 1);
80-
81-
if (pixman_region_not_empty(&tx->damage_region)) {
82-
nvnc_display_feed_buffer(tx->display, tx->current_fb,
83-
&tx->damage_region);
84-
pixman_region_clear(&tx->damage_region);
85-
}
86-
aml_poll(tx->aml, 0);
87-
aml_dispatch(tx->aml);
78+
pixman_region_union_rect(&tx->damage_region, &tx->damage_region, left, top,
79+
span_width, 1);
8880
}
8981

9082
static void twin_vnc_get_screen_size(twin_vnc_t *tx, int *width, int *height)
@@ -96,9 +88,13 @@ static void twin_vnc_get_screen_size(twin_vnc_t *tx, int *width, int *height)
9688
static bool _twin_vnc_work(void *closure)
9789
{
9890
twin_screen_t *screen = SCREEN(closure);
99-
100-
if (twin_screen_damaged(screen))
91+
twin_vnc_t *tx = PRIV(closure);
92+
if (twin_screen_damaged(screen)) {
93+
pixman_region_clear(&tx->damage_region);
10194
twin_screen_update(screen);
95+
nvnc_display_feed_buffer(tx->display, tx->current_fb,
96+
&tx->damage_region);
97+
}
10298
return true;
10399
}
104100

@@ -262,6 +258,14 @@ twin_context_t *twin_vnc_init(int width, int height)
262258
return NULL;
263259
}
264260

261+
static bool twin_vnc_poll(twin_context_t *ctx)
262+
{
263+
twin_vnc_t *tx = PRIV(ctx);
264+
aml_poll(tx->aml, 0);
265+
aml_dispatch(tx->aml);
266+
return true;
267+
}
268+
265269
static void twin_vnc_configure(twin_context_t *ctx)
266270
{
267271
int width, height;
@@ -288,6 +292,7 @@ static void twin_vnc_exit(twin_context_t *ctx)
288292

289293
const twin_backend_t g_twin_backend = {
290294
.init = twin_vnc_init,
295+
.poll = twin_vnc_poll,
291296
.configure = twin_vnc_configure,
292297
.exit = twin_vnc_exit,
293298
};

0 commit comments

Comments
 (0)