Eliminate one terminal copy per frame (20% speedup on benchmark)

This commit is contained in:
Keith Winstein
2012-03-14 01:59:07 -04:00
parent 612159490f
commit 487ab77e42
3 changed files with 31 additions and 14 deletions
+9 -4
View File
@@ -128,6 +128,7 @@ void STMClient::main_init( void )
/* local state */
local_framebuffer = new Terminal::Framebuffer( window_size.ws_col, window_size.ws_row );
new_state = new Terminal::Framebuffer( 1, 1 );
/* initialize screen */
string init = display.new_frame( false, *local_framebuffer, *local_framebuffer );
@@ -152,19 +153,23 @@ void STMClient::output_new_frame( void )
}
/* fetch target state */
Terminal::Framebuffer new_state( network->get_latest_remote_state().state.get_fb() );
*new_state = network->get_latest_remote_state().state.get_fb();
/* apply local overlays */
overlays.apply( new_state );
overlays.apply( *new_state );
/* calculate minimal difference from where we are */
const string diff( display.new_frame( !repaint_requested,
*local_framebuffer,
new_state ) );
*new_state ) );
swrite( STDOUT_FILENO, diff.data(), diff.size() );
*local_framebuffer = new_state;
repaint_requested = false;
/* switch pointers */
Terminal::Framebuffer *tmp = new_state;
new_state = local_framebuffer;
local_framebuffer = tmp;
}
bool STMClient::process_network_input( void )
+6 -1
View File
@@ -39,7 +39,7 @@ private:
int signal_fd;
struct winsize window_size;
Terminal::Framebuffer *local_framebuffer;
Terminal::Framebuffer *local_framebuffer, *new_state;
Overlay::OverlayManager overlays;
Network::Transport< Network::UserStream, Terminal::Complete > *network;
Terminal::Display display;
@@ -60,6 +60,7 @@ public:
signal_fd(),
window_size(),
local_framebuffer( NULL ),
new_state( NULL ),
overlays(),
network( NULL ),
display( true ), /* use TERM environment var to initialize display */
@@ -90,6 +91,10 @@ public:
delete local_framebuffer;
}
if ( new_state != NULL ) {
delete new_state;
}
if ( network != NULL ) {
delete network;
}