Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Antonio Scandurra
2442bf89f0 WIP: Optimistically produce a frame at the end of an effect cycle
Co-Authored-By: Thorsten Ball <thorsten@zed.dev>
2024-01-31 08:27:51 -08:00
4 changed files with 30 additions and 20 deletions

7
Cargo.lock generated
View file

@ -3255,6 +3255,7 @@ dependencies = [
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
"signpost",
"simplelog", "simplelog",
"slotmap", "slotmap",
"smallvec", "smallvec",
@ -7312,6 +7313,12 @@ dependencies = [
"rand_core 0.6.4", "rand_core 0.6.4",
] ]
[[package]]
name = "signpost"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acde4ef7ee97ad3bac7c4f73ee22ddb71067aa1d427a22efa76284de48eada41"
[[package]] [[package]]
name = "simdutf8" name = "simdutf8"
version = "0.1.4" version = "0.1.4"

View file

@ -47,6 +47,7 @@ seahash = "4.1"
serde.workspace = true serde.workspace = true
serde_derive.workspace = true serde_derive.workspace = true
serde_json.workspace = true serde_json.workspace = true
signpost = "0.1"
slotmap = "1.0.6" slotmap = "1.0.6"
smallvec.workspace = true smallvec.workspace = true
smol.workspace = true smol.workspace = true

View file

@ -652,25 +652,19 @@ impl AppContext {
} }
} }
} else { } else {
for window in self.windows.values() {
if let Some(window) = window.as_ref() {
if window.dirty {
window.platform_window.invalidate();
}
}
}
#[cfg(any(test, feature = "test-support"))]
for window in self for window in self
.windows .windows
.values() .values()
.filter_map(|window| { .filter_map(|window| {
let window = window.as_ref()?; let window = window.as_ref()?;
(window.dirty || window.focus_invalidated).then_some(window.handle) window.dirty.then_some(window.handle)
}) })
.collect::<Vec<_>>() .collect::<Vec<_>>()
{ {
self.update_window(window, |_, cx| cx.draw()).unwrap(); self.update_window(window, |_, cx| {
cx.draw();
})
.unwrap();
} }
if self.pending_effects.is_empty() { if self.pending_effects.is_empty() {

View file

@ -341,8 +341,16 @@ impl Window {
platform_window.on_request_frame(Box::new({ platform_window.on_request_frame(Box::new({
let mut cx = cx.to_async(); let mut cx = cx.to_async();
move || { move || {
measure("frame duration", || { signpost::trace_function(42, &[0; 4], || {
handle.update(&mut cx, |_, cx| cx.draw()).log_err(); measure("frame duration", || {
handle
.update(&mut cx, |_, cx| {
cx.window
.platform_window
.draw(&cx.window.rendered_frame.scene);
})
.log_err();
})
}) })
} }
})); }));
@ -380,10 +388,12 @@ impl Window {
platform_window.on_input({ platform_window.on_input({
let mut cx = cx.to_async(); let mut cx = cx.to_async();
Box::new(move |event| { Box::new(move |event| {
handle signpost::trace_function(41, &[0; 4], || {
.update(&mut cx, |_, cx| cx.dispatch_event(event)) handle
.log_err() .update(&mut cx, |_, cx| cx.dispatch_event(event))
.unwrap_or(false) .log_err()
.unwrap_or(false)
})
}) })
}); });
@ -1071,9 +1081,7 @@ impl<'a> WindowContext<'a> {
.retain(&(), |listener| listener(&event, self)); .retain(&(), |listener| listener(&event, self));
} }
self.window self.window.platform_window.invalidate();
.platform_window
.draw(&self.window.rendered_frame.scene);
self.window.refreshing = false; self.window.refreshing = false;
self.window.drawing = false; self.window.drawing = false;
} }