From 8471af5a7d092c9280cba5427f3a550bf0b4de32 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 28 Jul 2022 16:03:00 -0700 Subject: [PATCH] Improved render performance implementation to use a fork of alacritty which includes the last # of bytes processed as a way of estimating throughput in cases where the terminal output is chanegd in place --- Cargo.lock | 4 ++-- crates/terminal/Cargo.toml | 2 +- crates/terminal/src/terminal.rs | 19 +++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c2f71b544..d6310d76db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,7 +62,7 @@ dependencies = [ [[package]] name = "alacritty_config_derive" version = "0.1.0" -source = "git+https://github.com/zed-industries/alacritty?rev=382e1892c4eaae7d45ec6ea580db47242ec66e31#382e1892c4eaae7d45ec6ea580db47242ec66e31" +source = "git+https://github.com/zed-industries/alacritty?rev=ba56f545e3e3606af0112c6bdfe998baf7faab50#ba56f545e3e3606af0112c6bdfe998baf7faab50" dependencies = [ "proc-macro2", "quote", @@ -72,7 +72,7 @@ dependencies = [ [[package]] name = "alacritty_terminal" version = "0.17.0-dev" -source = "git+https://github.com/zed-industries/alacritty?rev=382e1892c4eaae7d45ec6ea580db47242ec66e31#382e1892c4eaae7d45ec6ea580db47242ec66e31" +source = "git+https://github.com/zed-industries/alacritty?rev=ba56f545e3e3606af0112c6bdfe998baf7faab50#ba56f545e3e3606af0112c6bdfe998baf7faab50" dependencies = [ "alacritty_config_derive", "base64 0.13.0", diff --git a/crates/terminal/Cargo.toml b/crates/terminal/Cargo.toml index e6d25f495b..354952481b 100644 --- a/crates/terminal/Cargo.toml +++ b/crates/terminal/Cargo.toml @@ -8,7 +8,7 @@ path = "src/terminal.rs" doctest = false [dependencies] -alacritty_terminal = { git = "https://github.com/zed-industries/alacritty", rev = "382e1892c4eaae7d45ec6ea580db47242ec66e31"} +alacritty_terminal = { git = "https://github.com/zed-industries/alacritty", rev = "ba56f545e3e3606af0112c6bdfe998baf7faab50"} editor = { path = "../editor" } util = { path = "../util" } gpui = { path = "../gpui" } diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index d7efecc486..d26f694abf 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -13,7 +13,7 @@ use alacritty_terminal::{ ansi::{ClearMode, Handler}, config::{Config, Program, PtyConfig, Scrolling}, event::{Event as AlacTermEvent, EventListener, Notify, WindowSize}, - event_loop::{EventLoop, Msg, Notifier}, + event_loop::{EventLoop, Msg, Notifier, READ_BUFFER_SIZE}, grid::{Dimensions, Scroll}, index::{Direction, Point}, selection::{Selection, SelectionType}, @@ -55,7 +55,7 @@ const DEBUG_TERMINAL_WIDTH: f32 = 500.; const DEBUG_TERMINAL_HEIGHT: f32 = 30.; //This needs to be wide enough that the CI & a local dev's prompt can fill the whole space. const DEBUG_CELL_WIDTH: f32 = 5.; const DEBUG_LINE_HEIGHT: f32 = 5.; -const MAX_FRAME_RATE: f32 = 120.; +const MAX_FRAME_RATE: f32 = 60.; const BACK_BUFFER_SIZE: usize = 5000; ///Upward flowing events, for changing the title and such @@ -412,7 +412,7 @@ impl Terminal { ///Tells the render loop how many frames to skip before reading from the terminal. fn frames_to_skip(&self) -> usize { - self.frames_to_skip + 0 //self.frames_to_skip } fn push_events(&mut self, events: Vec) { @@ -570,17 +570,16 @@ impl Terminal { self.process_terminal_event(&e, &mut term, cx) } - let buffer_velocity = term.grid().history_size().saturating_sub(BACK_BUFFER_SIZE); - - let fractional_velocity = buffer_velocity as f32 / BACK_BUFFER_SIZE as f32; + //TODO: determine a better metric for this + let buffer_velocity = + (term.last_processed_bytes() as f32 / (READ_BUFFER_SIZE as f32 / 4.)).clamp(0., 1.); //2nd power - let scaled_fraction = fractional_velocity * fractional_velocity; + let scaled_velocity = buffer_velocity * buffer_velocity; - self.frames_to_skip = (scaled_fraction * (Self::default_fps() / 10.)).round() as usize; + self.frames_to_skip = (scaled_velocity * (Self::default_fps() / 10.)).round() as usize; - term.grid_mut().update_history(BACK_BUFFER_SIZE); //Clear out the measurement space - term.grid_mut().update_history(BACK_BUFFER_SIZE * 2); //Extra space for measuring + term.set_last_processed_bytes(0); //Clear it in case no reads between this lock and the next. let content = term.renderable_content();