From bf843e213100e28a03aa92d40630541a6498b9eb Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Tue, 23 Jan 2024 11:43:51 +0100 Subject: [PATCH] Cache last used layer_id for StackingOrder This optimizes rendering time by saving computation of the layer_id and comparison when inserting it into the `BTreeMaps`. Co-authored-by: Antonio --- crates/gpui/src/scene.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/gpui/src/scene.rs b/crates/gpui/src/scene.rs index 4ba65ef1e9..70e24030b1 100644 --- a/crates/gpui/src/scene.rs +++ b/crates/gpui/src/scene.rs @@ -39,6 +39,7 @@ impl From for EntityId { #[derive(Default)] pub(crate) struct Scene { + last_layer: Option<(StackingOrder, LayerId)>, layers_by_order: BTreeMap, orders_by_layer: BTreeMap, pub(crate) shadows: Vec, @@ -52,6 +53,7 @@ pub(crate) struct Scene { impl Scene { pub fn clear(&mut self) { + self.last_layer = None; self.layers_by_order.clear(); self.orders_by_layer.clear(); self.shadows.clear(); @@ -139,14 +141,22 @@ impl Scene { } fn layer_id_for_order(&mut self, order: &StackingOrder) -> LayerId { - if let Some(layer_id) = self.layers_by_order.get(order) { + if let Some((last_order, last_layer_id)) = self.last_layer.as_ref() { + if order == last_order { + return *last_layer_id; + } + } + + let layer_id = if let Some(layer_id) = self.layers_by_order.get(order) { *layer_id } else { let next_id = self.layers_by_order.len() as LayerId; self.layers_by_order.insert(order.clone(), next_id); self.orders_by_layer.insert(next_id, order.clone()); next_id - } + }; + self.last_layer = Some((order.clone(), layer_id)); + layer_id } pub fn reuse_views(&mut self, views: &FxHashSet, prev_scene: &mut Self) {