From 85d805acb71ccc4d22e920e21050a35cc8a6bcff Mon Sep 17 00:00:00 2001 From: itsjunetime Date: Fri, 17 May 2024 12:06:37 -0600 Subject: [PATCH] Make rendering performance slightly better, maybe --- src/main.rs | 11 ++++++++--- src/tui.rs | 13 +++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2277149..4f2537b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ -use std::{path::PathBuf, str::FromStr}; +use std::{io::stdout, path::PathBuf, str::FromStr}; use converter::Converter; -use crossterm::{execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}}; +use crossterm::{execute, terminal::{disable_raw_mode, enable_raw_mode, EndSynchronizedUpdate, EnterAlternateScreen, LeaveAlternateScreen}}; use glib::{LogField, LogLevel, LogWriterOutput}; use notify::{RecursiveMode, Watcher}; use ratatui::{backend::CrosstermBackend, Terminal}; @@ -137,9 +137,14 @@ async fn main() -> Result<(), Box> { } if needs_redraw { + let mut end_update = false; term.draw(|f| { - tui.render(f, &main_area); + tui.render(f, &main_area, &mut end_update); + // f.bypass_diff = true; })?; + if end_update { + execute!(stdout(), EndSynchronizedUpdate)?; + } } } diff --git a/src/tui.rs b/src/tui.rs index 6b65a05..4577798 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -1,6 +1,6 @@ -use std::rc::Rc; +use std::{io::stdout, rc::Rc}; -use crossterm::event::{Event, KeyCode, MouseEventKind}; +use crossterm::{event::{Event, KeyCode, MouseEventKind}, execute, terminal::BeginSynchronizedUpdate}; use ratatui::{layout::{Constraint, Flex, Layout, Rect}, style::{Color, Style}, text::Span, widgets::{Block, Borders, Padding}, Frame}; use ratatui_image::{protocol::Protocol, Image}; @@ -52,7 +52,7 @@ impl Tui { .split(frame.size()) } - pub fn render(&mut self, frame: &mut Frame<'_>, main_area: &[Rect]) { + pub fn render(&mut self, frame: &mut Frame<'_>, main_area: &[Rect], end_update: &mut bool) { let top_block = Block::new() .padding(Padding { right: 2, @@ -143,7 +143,6 @@ impl Tui { // resize this time), then go through every element in the buffer where any Image would // be written and set to skip it so that ratatui doesn't spend a lot of time diffing it // each re-render - self.last_render.rect = size; frame.render_widget(Skip::new(true), img_area); } else { // here we calculate how many pages can fit in the available area. @@ -178,6 +177,9 @@ impl Tui { // If none are ready to render, just show the loading thing Self::render_loading_in(frame, img_area); } else { + execute!(stdout(), BeginSynchronizedUpdate).unwrap(); + *end_update = true; + let total_width = page_widths .iter() .map(|(_, w)| w) @@ -199,11 +201,10 @@ impl Tui { self.render_single_page(frame, page_idx + self.page, Rect { width, ..img_area }); img_area.x += width; } - // frame.bypass_diff = true; // we want to set this at the very end so it doesn't get set somewhere halfway through and // then the whole diffing thing messes it up - self.last_render.rect = frame.size(); + self.last_render.rect = size; } } }