mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Fix animation smoothness when using requestAnimationFrame.
Previously, the flow for ticking animations was: Compositor -> Constellation -> Layout -> Script However, this means that the compositor <-> layout messages can thrash, meaning layout thread is very rarely idle. This means that the script thread (which joins on the layout thread during reflow) was unable to execute and run rAF callbacks. With this change, the flow is now: Compositor -> Constellation -> Script (when rAF is active). Compositor -> Constellation -> Layout (when transitions / animations are active and no rAF is present). This makes rAF based animation *much* smoother.
This commit is contained in:
parent
46256b33ef
commit
92061132f3
5 changed files with 37 additions and 15 deletions
|
@ -9,6 +9,7 @@
|
|||
//! navigation context, each `Pipeline` encompassing a `ScriptThread`,
|
||||
//! `LayoutThread`, and `PaintThread`.
|
||||
|
||||
use AnimationTickType;
|
||||
use CompositorMsg as FromCompositorMsg;
|
||||
use canvas::canvas_paint_thread::CanvasPaintThread;
|
||||
use canvas::webgl_paint_thread::WebGLPaintThread;
|
||||
|
@ -585,8 +586,8 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF>
|
|||
debug!("constellation got window resize message");
|
||||
self.handle_resized_window_msg(new_size);
|
||||
}
|
||||
Request::Compositor(FromCompositorMsg::TickAnimation(pipeline_id)) => {
|
||||
self.handle_tick_animation(pipeline_id)
|
||||
Request::Compositor(FromCompositorMsg::TickAnimation(pipeline_id, tick_type)) => {
|
||||
self.handle_tick_animation(pipeline_id, tick_type)
|
||||
}
|
||||
Request::Compositor(FromCompositorMsg::WebDriverCommand(command)) => {
|
||||
debug!("constellation got webdriver command message");
|
||||
|
@ -912,12 +913,22 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF>
|
|||
animation_state))
|
||||
}
|
||||
|
||||
fn handle_tick_animation(&mut self, pipeline_id: PipelineId) {
|
||||
self.pipeline(pipeline_id)
|
||||
.layout_chan
|
||||
.0
|
||||
.send(LayoutControlMsg::TickAnimations)
|
||||
.unwrap();
|
||||
fn handle_tick_animation(&mut self, pipeline_id: PipelineId, tick_type: AnimationTickType) {
|
||||
match tick_type {
|
||||
AnimationTickType::Script => {
|
||||
self.pipeline(pipeline_id)
|
||||
.script_chan
|
||||
.send(ConstellationControlMsg::TickAllAnimations(pipeline_id))
|
||||
.unwrap();
|
||||
}
|
||||
AnimationTickType::Layout => {
|
||||
self.pipeline(pipeline_id)
|
||||
.layout_chan
|
||||
.0
|
||||
.send(LayoutControlMsg::TickAnimations)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_load_url_msg(&mut self, source_id: PipelineId, load_data: LoadData) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue