Eliminate one terminal copy per frame (20% speedup on benchmark)
This commit is contained in:
@@ -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 )
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user