[PATCH] ui/ncurses: Reduce unnecessary calls to redrawwin

Samuel Mendoza-Jonas sam.mj at au1.ibm.com
Fri Feb 6 13:57:12 AEDT 2015


All current *_post() methods in ui/ncurses call redrawwin() and
wrefresh() together. wrefresh() updates any lines on the screen that
have been marked as changed or invalid. However redrawwin() marks the
entire screen as invalid unconditionally. We can reduce the amount of
data written to the screen by avoiding calls to redrawwin().

Screen transitions are the primary use case of redrawwin(), where the
whole screen must be invalidated to avoid stale data remaining on
screen. All other 'in-screen' updates such as changes to widgets or
changing focus do not require a call to redrawwin(). The most noticeable
performance improvement is in nc-menu, which makes an unnecssary call to
redrawwin() after every addition to the boot option menu.

eg. The number of bytes written to STDOUT in the main menu:
	# Boot options	| Before | After
	--------------------------------
		8	| 5488   | 1149
		133	| 422454 | 4652

Signed-off-by: Samuel Mendoza-Jonas <sam.mj at au1.ibm.com>
---
 ui/ncurses/nc-add-url.c     | 8 +++++++-
 ui/ncurses/nc-boot-editor.c | 8 +++++++-
 ui/ncurses/nc-config.c      | 8 +++++++-
 ui/ncurses/nc-lang.c        | 1 -
 ui/ncurses/nc-menu.c        | 1 -
 5 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/ui/ncurses/nc-add-url.c b/ui/ncurses/nc-add-url.c
index 386d813..cf55b03 100644
--- a/ui/ncurses/nc-add-url.c
+++ b/ui/ncurses/nc-add-url.c
@@ -43,6 +43,7 @@ struct add_url_screen {
 
 	bool			exit;
 	bool			show_help;
+	bool			need_redraw;
 	void			(*on_exit)(struct cui *);
 
 	int			label_x;
@@ -93,6 +94,7 @@ static void add_url_screen_process_key(struct nc_scr *scr, int key)
 
 	} else if (screen->show_help) {
 		screen->show_help = false;
+		screen->need_redraw = true;
 		cui_show_help(screen->cui, _("Retrieve Config"),
 			&add_url_help_text);
 
@@ -106,7 +108,10 @@ static int add_url_screen_post(struct nc_scr *scr)
 	struct add_url_screen *screen = add_url_screen_from_scr(scr);
 	widgetset_post(screen->widgetset);
 	nc_scr_frame_draw(scr);
-	redrawwin(scr->main_ncw);
+	if (screen->need_redraw) {
+		redrawwin(scr->main_ncw);
+		screen->need_redraw = false;
+	}
 	wrefresh(screen->scr.main_ncw);
 	return 0;
 }
@@ -224,6 +229,7 @@ struct add_url_screen *add_url_screen_init(struct cui *cui,
 	screen->on_exit = on_exit;
 	screen->label_x = 2;
 	screen->field_x = 25;
+	screen->need_redraw = false;
 
 	nc_scr_init(&screen->scr, pb_add_url_screen_sig, 0,
 		cui, add_url_screen_process_key,
diff --git a/ui/ncurses/nc-boot-editor.c b/ui/ncurses/nc-boot-editor.c
index 409e638..096dc6e 100644
--- a/ui/ncurses/nc-boot-editor.c
+++ b/ui/ncurses/nc-boot-editor.c
@@ -44,6 +44,7 @@ struct boot_editor {
 	void			(*on_exit)(struct cui *cui,
 					struct pmenu_item *item,
 					struct pb_boot_data *bd);
+	bool			need_redraw;
 
 	int			label_x;
 	int			field_x;
@@ -111,7 +112,10 @@ static int boot_editor_post(struct nc_scr *scr)
 	struct boot_editor *boot_editor = boot_editor_from_scr(scr);
 	widgetset_post(boot_editor->widgetset);
 	nc_scr_frame_draw(scr);
-	redrawwin(scr->main_ncw);
+	if (boot_editor->need_redraw) {
+		redrawwin(scr->main_ncw);
+		boot_editor->need_redraw = false;
+	}
 	wrefresh(boot_editor->scr.main_ncw);
 	pad_refresh(boot_editor);
 	return 0;
@@ -222,6 +226,7 @@ static void boot_editor_process_key(struct nc_scr *scr, int key)
 		break;
 	case STATE_HELP:
 		boot_editor->state = STATE_EDIT;
+		boot_editor->need_redraw = true;
 		cui_show_help(boot_editor->cui, _("Boot Option Editor"),
 				&boot_editor_help_text);
 		break;
@@ -559,6 +564,7 @@ struct boot_editor *boot_editor_init(struct cui *cui,
 	boot_editor->item = item;
 	boot_editor->on_exit = on_exit;
 	boot_editor->state = STATE_EDIT;
+	boot_editor->need_redraw = false;
 
 	int ncols1 = strncols(_("Device tree:"));
 	int ncols2 = strncols(_("Boot arguments:"));
diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c
index 17cc380..c45df34 100644
--- a/ui/ncurses/nc-config.c
+++ b/ui/ncurses/nc-config.c
@@ -57,6 +57,7 @@ struct config_screen {
 
 	bool			exit;
 	bool			show_help;
+	bool			need_redraw;
 	void			(*on_exit)(struct cui *);
 
 	int			scroll_y;
@@ -146,6 +147,7 @@ static void config_screen_process_key(struct nc_scr *scr, int key)
 
 	} else if (screen->show_help) {
 		screen->show_help = false;
+		screen->need_redraw = true;
 		cui_show_help(screen->cui, _("System Configuration"),
 				&config_help_text);
 
@@ -165,7 +167,10 @@ static int config_screen_post(struct nc_scr *scr)
 	struct config_screen *screen = config_screen_from_scr(scr);
 	widgetset_post(screen->widgetset);
 	nc_scr_frame_draw(scr);
-	redrawwin(scr->main_ncw);
+	if (screen->need_redraw) {
+		redrawwin(scr->main_ncw);
+		screen->need_redraw = false;
+	}
 	wrefresh(screen->scr.main_ncw);
 	pad_refresh(screen);
 	return 0;
@@ -859,6 +864,7 @@ struct config_screen *config_screen_init(struct cui *cui,
 
 	screen->cui = cui;
 	screen->on_exit = on_exit;
+	screen->need_redraw = false;
 	screen->label_x = 2;
 	screen->field_x = 17;
 
diff --git a/ui/ncurses/nc-lang.c b/ui/ncurses/nc-lang.c
index 0422ebb..0b87156 100644
--- a/ui/ncurses/nc-lang.c
+++ b/ui/ncurses/nc-lang.c
@@ -131,7 +131,6 @@ static int lang_screen_post(struct nc_scr *scr)
 	struct lang_screen *screen = lang_screen_from_scr(scr);
 	widgetset_post(screen->widgetset);
 	nc_scr_frame_draw(scr);
-	redrawwin(scr->main_ncw);
 	wrefresh(screen->scr.main_ncw);
 	pad_refresh(screen);
 	return 0;
diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c
index 7ff2468..b8f9a35 100644
--- a/ui/ncurses/nc-menu.c
+++ b/ui/ncurses/nc-menu.c
@@ -62,7 +62,6 @@ static int pmenu_post(struct nc_scr *scr)
 	result = post_menu(menu->ncm);
 
 	nc_scr_frame_draw(scr);
-	redrawwin(menu->scr.main_ncw);
 	wrefresh(menu->scr.main_ncw);
 
 	return result;
-- 
2.1.0



More information about the Petitboot mailing list