Merge pull request #1464 from zed-industries/lower-latency

Mikayla Maki created

Lower terminal latency

Change summary

crates/terminal/src/terminal.rs | 53 +++++++++++++++++++++-------------
1 file changed, 32 insertions(+), 21 deletions(-)

Detailed changes

crates/terminal/src/terminal.rs 🔗

@@ -356,32 +356,43 @@ impl TerminalBuilder {
             use futures::StreamExt;
 
             while let Some(event) = self.events_rx.next().await {
-                let mut timer = cx.background().timer(Duration::from_millis(2)).fuse();
-                let mut events = vec![event];
-
-                loop {
-                    futures::select_biased! {
-                        _ = timer => break,
-                        event = self.events_rx.next() => {
-                            if let Some(event) = event {
-                                events.push(event);
-                                if events.len() > 100 {
+                this.upgrade(&cx)?.update(&mut cx, |this, cx| {
+                    //Process the first event immediately for lowered latency
+                    this.process_event(&event, cx);
+                });
+
+                'outer: loop {
+                    let mut events = vec![];
+                    let mut timer = cx.background().timer(Duration::from_millis(4)).fuse();
+
+                    loop {
+                        futures::select_biased! {
+                            _ = timer => break,
+                            event = self.events_rx.next() => {
+                                if let Some(event) = event {
+                                    events.push(event);
+                                    if events.len() > 100 {
+                                        break;
+                                    }
+                                } else {
                                     break;
                                 }
-                            } else {
-                                break;
-                            }
-                        },
+                            },
+                        }
                     }
-                }
 
-                this.upgrade(&cx)?.update(&mut cx, |this, cx| {
-                    for event in events {
-                        this.process_event(&event, cx);
+                    if events.len() == 0 {
+                        smol::future::yield_now().await;
+                        break 'outer;
+                    } else {
+                        this.upgrade(&cx)?.update(&mut cx, |this, cx| {
+                            for event in events {
+                                this.process_event(&event, cx);
+                            }
+                        });
+                        smol::future::yield_now().await;
                     }
-                });
-
-                smol::future::yield_now().await;
+                }
             }
 
             Some(())