Index: cc/trees/layer_tree_host_common.cc |
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc |
index 01875e93ba0e3b1c44aef386b9839e82749db29b..63b13986a19feffa87c506f35f1ce7b6ce46f2cd 100644 |
--- a/cc/trees/layer_tree_host_common.cc |
+++ b/cc/trees/layer_tree_host_common.cc |
@@ -618,11 +618,9 @@ static float TranslationFromActiveTreeLayerScreenSpaceTransform( |
} |
// A layer jitters if its screen space transform is same on two successive |
-// commits, but has changed in between the commits. CalculateFrameJitter |
-// computes the jitter in the entire frame. |
-int LayerTreeHostCommon::CalculateFrameJitter(LayerImpl* layer) { |
- if (!layer) |
- return 0.f; |
+// commits, but has changed in between the commits. CalculateLayerJitter |
+// computes the jitter for the layer. |
+int LayerTreeHostCommon::CalculateLayerJitter(LayerImpl* layer) { |
float jitter = 0.f; |
layer->performance_properties().translation_from_last_frame = 0.f; |
layer->performance_properties().last_commit_screen_space_transform = |
@@ -651,15 +649,6 @@ int LayerTreeHostCommon::CalculateFrameJitter(LayerImpl* layer) { |
} |
} |
} |
- // Descendants of jittering layer will not contribute to unique jitter. |
- if (jitter > 0.f) |
- return jitter; |
- |
- for (size_t i = 0; i < layer->children().size(); ++i) { |
- LayerImpl* child_layer = |
- LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i); |
- jitter += CalculateFrameJitter(child_layer); |
- } |
return jitter; |
} |
@@ -1086,7 +1075,26 @@ void LayerTreeHostCommon::CalculateDrawProperties( |
if (active_tree_root) { |
LayerImpl* last_scrolled_layer = layer_tree_impl->LayerById( |
active_tree_root->layer_tree_impl()->LastScrolledLayerId()); |
- jitter = CalculateFrameJitter(last_scrolled_layer); |
+ if (last_scrolled_layer) { |
+ const int last_scrolled_scroll_node_id = |
+ last_scrolled_layer->scroll_tree_index(); |
+ std::unordered_set<int> jitter_nodes; |
+ for (auto* layer : *layer_tree_impl) { |
+ // Layers that have the same scroll tree index jitter together. So, |
+ // it is enough to calculate jitter on one of these layers. So, |
+ // after we find a jittering layer, we need not consider other |
+ // layers with the same scroll tree index. |
+ int scroll_tree_index = layer->scroll_tree_index(); |
+ if (last_scrolled_scroll_node_id <= scroll_tree_index && |
+ jitter_nodes.find(scroll_tree_index) == jitter_nodes.end()) { |
+ float layer_jitter = CalculateLayerJitter(layer); |
+ if (layer_jitter > 0.f) { |
+ jitter_nodes.insert(layer->scroll_tree_index()); |
+ jitter += layer_jitter; |
+ } |
+ } |
+ } |
+ } |
} |
TRACE_EVENT_ASYNC_BEGIN1( |
"cdp.perf", "jitter", |