shithub: microui

Download patch

ref: f3715001d77d5f3a83fc4976779728c215a05338
parent: 9ef30564239e08cc1f21fe2e04094fe015350ee8
author: Sigrid Haflínudóttir <[email protected]>
date: Thu Jan 2 15:12:23 EST 2020

reduce the amount of unneeded redraws by checking if commands got updated

--- a/demo/plan9.c
+++ b/demo/plan9.c
@@ -26,6 +26,8 @@
 	mu_Command *cmd;
 	mu_Context *ctx;
 	Biobuf *snarf;
+	char *oldcmds;
+	int oldcmdsidx;
 
 	USED(argc); USED(argv);
 
@@ -44,30 +46,34 @@
 	threadsetname("microui demo");
 
 	ctx = malloc(sizeof(mu_Context));
-	r_init();
-
-	/* init microui */
 	mu_init(ctx);
 	ctx->text_width = r_get_text_width;
 	ctx->text_height = r_get_text_height;
 	ctx->style->font = display->defaultfont;
+	r_init();
 	process_frame(ctx);
 
 	oldbuttons = 0;
+	oldcmds = malloc(sizeof(ctx->command_list.items));
+	oldcmdsidx = -1;
 	for (;;) {
 		process_frame(ctx);
 
-		cmd = nil;
-		r_clear(mu_color(bg[0], bg[1], bg[2], 255));
-		while (mu_next_command(ctx, &cmd)) {
-			switch (cmd->type) {
-			case MU_COMMAND_TEXT: r_draw_text(ctx->style->font, cmd->text.str, cmd->text.pos, cmd->text.color); break;
-			case MU_COMMAND_RECT: r_draw_rect(cmd->rect.rect, cmd->rect.color); break;
-			case MU_COMMAND_ICON: r_draw_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color); break;
-			case MU_COMMAND_CLIP: r_set_clip_rect(cmd->clip.rect); break;
+		if (oldcmdsidx != ctx->command_list.idx || memcmp(oldcmds, ctx->command_list.items, oldcmdsidx) != 0) {
+			oldcmdsidx = ctx->command_list.idx;
+			memmove(oldcmds, ctx->command_list.items, oldcmdsidx);
+			cmd = nil;
+			r_clear(mu_color(bg[0], bg[1], bg[2], 255));
+			while (mu_next_command(ctx, &cmd)) {
+				switch (cmd->type) {
+				case MU_COMMAND_TEXT: r_draw_text(ctx->style->font, cmd->text.str, cmd->text.pos, cmd->text.color); break;
+				case MU_COMMAND_RECT: r_draw_rect(cmd->rect.rect, cmd->rect.color); break;
+				case MU_COMMAND_ICON: r_draw_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color); break;
+				case MU_COMMAND_CLIP: r_set_clip_rect(cmd->clip.rect); break;
+				}
 			}
+			r_present();
 		}
-		r_present();
 
 		gotevent = 1;
 		switch (alt(a)) {