Changeset 31858 in webkit


Ignore:
Timestamp:
Apr 13, 2008 11:23:50 PM (16 years ago)
Author:
hyatt@apple.com
Message:

2008-04-13 David Hyatt <hyatt@apple.com>

Fix for bug 18466, WebKit exhibits slow performance on Opera DHTML benchmark. Improve layout's rect
invalidation code to only invalidate a single unioned rect once enough individual little rects have
been detected.

Reviewed by olliej

  • page/FrameView.cpp: (WebCore::FrameViewPrivate::reset): (WebCore::FrameView::layout): (WebCore::FrameView::repaintRectangle): (WebCore::FrameView::beginDeferredRepaints): (WebCore::FrameView::endDeferredRepaints):
  • page/FrameView.h:
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r31857 r31858  
     12008-04-13  David Hyatt  <hyatt@apple.com>
     2
     3        Fix for bug 18466, WebKit exhibits slow performance on Opera DHTML benchmark.  Improve layout's rect
     4        invalidation code to only invalidate a single unioned rect once enough individual little rects have
     5        been detected.
     6
     7        Reviewed by olliej
     8
     9        * page/FrameView.cpp:
     10        (WebCore::FrameViewPrivate::reset):
     11        (WebCore::FrameView::layout):
     12        (WebCore::FrameView::repaintRectangle):
     13        (WebCore::FrameView::beginDeferredRepaints):
     14        (WebCore::FrameView::endDeferredRepaints):
     15        * page/FrameView.h:
     16
    1172008-04-13  Eric Seidel  <eric@webkit.org>
    218
  • trunk/WebCore/page/FrameView.cpp

    r31268 r31858  
    9494        lastLayoutSize = IntSize();
    9595        lastZoomFactor = 1.0f;
     96        m_deferringRepaints = 0;
     97        m_repaintCount = 0;
     98        m_repaintRect = IntRect();
     99        m_repaintRects.clear();
    96100    }
    97101
     
    134138    bool m_wasScrolledByUser;
    135139    bool m_inProgrammaticScroll;
     140   
     141    unsigned m_deferringRepaints;
     142    unsigned m_repaintCount;
     143    IntRect m_repaintRect;
     144    Vector<IntRect> m_repaintRects;
    136145};
    137146
     
    467476    if (subtree)
    468477        root->view()->pushLayoutState(root);
     478       
    469479    d->midLayout = true;
     480    beginDeferredRepaints();
    470481    root->layout();
     482    endDeferredRepaints();
    471483    d->midLayout = false;
     484
    472485    if (subtree)
    473486        root->view()->popLayoutState();
     
    482495
    483496    // Now update the positions of all layers.
     497    beginDeferredRepaints();
    484498    layer->updateLayerPositions(d->doFullRepaint);
    485 
     499    endDeferredRepaints();
     500   
    486501    d->layoutCount++;
    487502
     
    694709}
    695710
     711const unsigned cRepaintRectUnionThreshold = 25;
     712
    696713void FrameView::repaintRectangle(const IntRect& r, bool immediate)
    697714{
     715    if (d->m_deferringRepaints && !immediate) {
     716        IntRect visibleContent = enclosingIntRect(visibleContentRect());
     717        visibleContent.intersect(r);
     718        if (!visibleContent.isEmpty()) {
     719            d->m_repaintCount++;
     720            d->m_repaintRect.unite(r);
     721            if (d->m_repaintCount == cRepaintRectUnionThreshold)
     722                d->m_repaintRects.clear();
     723            else if (d->m_repaintCount < cRepaintRectUnionThreshold)
     724                d->m_repaintRects.append(r);
     725        }
     726        return;
     727    }
     728   
    698729    updateContents(r, immediate);
     730}
     731
     732void FrameView::beginDeferredRepaints()
     733{
     734    Page* page = m_frame->page();
     735    if (page->mainFrame() != m_frame)
     736        return page->mainFrame()->view()->beginDeferredRepaints();
     737
     738    d->m_deferringRepaints++;
     739    d->m_repaintCount = 0;
     740    d->m_repaintRect = IntRect();
     741    d->m_repaintRects.clear();
     742}
     743
     744
     745void FrameView::endDeferredRepaints()
     746{
     747    Page* page = m_frame->page();
     748    if (page->mainFrame() != m_frame)
     749        return page->mainFrame()->view()->endDeferredRepaints();
     750
     751    ASSERT(d->m_deferringRepaints > 0);
     752    if (--d->m_deferringRepaints == 0) {
     753        if (d->m_repaintCount >= cRepaintRectUnionThreshold)
     754            repaintRectangle(d->m_repaintRect, false);
     755        else {
     756            unsigned size = d->m_repaintRects.size();
     757            for (unsigned i = 0; i < size; i++)
     758                repaintRectangle(d->m_repaintRects[i], false);
     759            d->m_repaintRects.clear();
     760        }
     761    }
    699762}
    700763
  • trunk/WebCore/page/FrameView.h

    r31250 r31858  
    122122    void removeSlowRepaintObject();
    123123
     124    void beginDeferredRepaints();
     125    void endDeferredRepaints();
     126
    124127    void updateDashboardRegions();
    125128    void updateControlTints();
Note: See TracChangeset for help on using the changeset viewer.