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_derive",
"serde_json",
"signpost",
"simplelog",
"slotmap",
"smallvec",
@ -7312,6 +7313,12 @@ dependencies = [
"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]]
name = "simdutf8"
version = "0.1.4"

View file

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

View file

@ -652,25 +652,19 @@ impl AppContext {
}
}
} 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
.windows
.values()
.filter_map(|window| {
let window = window.as_ref()?;
(window.dirty || window.focus_invalidated).then_some(window.handle)
window.dirty.then_some(window.handle)
})
.collect::<Vec<_>>()
{
self.update_window(window, |_, cx| cx.draw()).unwrap();
self.update_window(window, |_, cx| {
cx.draw();
})
.unwrap();
}
if self.pending_effects.is_empty() {

View file

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