Title: [152806] trunk/Source/WebCore
Revision
152806
Author
[email protected]
Date
2013-07-17 15:08:35 -0700 (Wed, 17 Jul 2013)

Log Message

Optimize RenderLayerCompositor's OverlapMap
https://bugs.webkit.org/show_bug.cgi?id=118764

Reviewed by Tim Horton.

Overlap stack items can have RectLists with hundreds of rectangles.
This makes the linear search in OverlapMap::overlapsLayers() very slow.

Optimize by storing the bounding rect of the list of rects, and doing an early
check on that. This reduces time spent in RenderLayer::scrollTo() by 13% in some
content with lots of layers inside an overflow:scroll.

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::OverlapMap::overlapsLayers):
(WebCore::RenderLayerCompositor::OverlapMap::popCompositingContainer):
(WebCore::RenderLayerCompositor::OverlapMap::RectList::append):
(WebCore::RenderLayerCompositor::OverlapMap::RectList::intersects):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (152805 => 152806)


--- trunk/Source/WebCore/ChangeLog	2013-07-17 22:05:45 UTC (rev 152805)
+++ trunk/Source/WebCore/ChangeLog	2013-07-17 22:08:35 UTC (rev 152806)
@@ -1,3 +1,23 @@
+2013-07-17  Simon Fraser  <[email protected]>
+
+        Optimize RenderLayerCompositor's OverlapMap
+        https://bugs.webkit.org/show_bug.cgi?id=118764
+
+        Reviewed by Tim Horton.
+
+        Overlap stack items can have RectLists with hundreds of rectangles.
+        This makes the linear search in OverlapMap::overlapsLayers() very slow.
+        
+        Optimize by storing the bounding rect of the list of rects, and doing an early
+        check on that. This reduces time spent in RenderLayer::scrollTo() by 13% in some
+        content with lots of layers inside an overflow:scroll.
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::OverlapMap::overlapsLayers):
+        (WebCore::RenderLayerCompositor::OverlapMap::popCompositingContainer):
+        (WebCore::RenderLayerCompositor::OverlapMap::RectList::append):
+        (WebCore::RenderLayerCompositor::OverlapMap::RectList::intersects):
+
 2013-07-17  Bem Jones-Bey  <[email protected]>
 
         [CSS Shapes] Port refactoring of shape-outside code from Blink

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (152805 => 152806)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2013-07-17 22:05:45 UTC (rev 152805)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2013-07-17 22:08:35 UTC (rev 152806)
@@ -119,12 +119,7 @@
 
     bool overlapsLayers(const IntRect& bounds) const
     {
-        const RectList& layerRects = m_overlapStack.last();
-        for (unsigned i = 0; i < layerRects.size(); i++) {
-            if (layerRects[i].intersects(bounds))
-                return true;
-        }
-        return false;
+        return m_overlapStack.last().intersects(bounds);
     }
 
     bool isEmpty()
@@ -139,14 +134,42 @@
 
     void popCompositingContainer()
     {
-        m_overlapStack[m_overlapStack.size() - 2].appendVector(m_overlapStack.last());
+        m_overlapStack[m_overlapStack.size() - 2].append(m_overlapStack.last());
         m_overlapStack.removeLast();
     }
 
     RenderGeometryMap& geometryMap() { return m_geometryMap; }
 
 private:
-    typedef Vector<IntRect> RectList;
+    struct RectList {
+        Vector<IntRect> rects;
+        IntRect boundingRect;
+        
+        void append(const IntRect& rect)
+        {
+            rects.append(rect);
+            boundingRect.unite(rect);
+        }
+
+        void append(const RectList& rectList)
+        {
+            rects.appendVector(rectList.rects);
+            boundingRect.unite(rectList.boundingRect);
+        }
+        
+        bool intersects(const IntRect& rect) const
+        {
+            if (!rects.size() || !boundingRect.intersects(rect))
+                return false;
+
+            for (unsigned i = 0; i < rects.size(); i++) {
+                if (rects[i].intersects(rect))
+                    return true;
+            }
+            return false;
+        }
+    };
+
     Vector<RectList> m_overlapStack;
     HashSet<const RenderLayer*> m_layers;
     RenderGeometryMap m_geometryMap;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to