Changeset 41431 in webkit


Ignore:
Timestamp:
Mar 4, 2009 2:01:38 PM (15 years ago)
Author:
Antti Koivisto
Message:

JavaScriptCore:

2009-03-04 Antti Koivisto <Antti Koivisto>

Reviewed by Dave Hyatt.

https://bugs.webkit.org/show_bug.cgi?id=24359
Repaint throttling mechanism


Set ENABLE_REPAINT_THROTTLING to 0 by default.

  • wtf/Platform.h:

WebCore:

2009-03-04 Antti Koivisto <Antti Koivisto>

Reviewed by Dave Hyatt.

https://bugs.webkit.org/show_bug.cgi?id=24359
Repaint throttling mechanism


Excessive repainting can slow down page loadind. This implements a timer
based throttling mechanism. It is behind ENABLE(REPAINT_THROTTLING) and not
enabled by default.

  • loader/FrameLoader.cpp: (WebCore::FrameLoader::checkCompleted):
  • page/EventHandler.cpp: (WebCore::EventHandler::dispatchDragEvent): (WebCore::EventHandler::dispatchMouseEvent): (WebCore::EventHandler::keyEvent): (WebCore::EventHandler::handleTextInputEvent):
  • page/FrameView.cpp: (WebCore::FrameView::FrameView): (WebCore::FrameView::reset): (WebCore::FrameView::repaintContentRectangle): (WebCore::FrameView::beginDeferredRepaints): (WebCore::FrameView::endDeferredRepaints): (WebCore::FrameView::checkStopDelayingDeferredRepaints): (WebCore::FrameView::doDeferredRepaints): (WebCore::FrameView::updateDeferredRepaintDelay): (WebCore::FrameView::resetDeferredRepaintDelay): (WebCore::FrameView::adjustedDeferredRepaintDelay): (WebCore::FrameView::deferredRepaintTimerFired): (WebCore::FrameView::paintContents):
  • page/FrameView.h:
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r41417 r41431  
     12009-03-04  Antti Koivisto  <antti@apple.com>
     2
     3        Reviewed by Dave Hyatt.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=24359
     6        Repaint throttling mechanism
     7       
     8        Set ENABLE_REPAINT_THROTTLING to 0 by default.
     9
     10        * wtf/Platform.h:
     11
    1122009-03-03  David Kilzer  <ddkilzer@apple.com>
    213
  • trunk/JavaScriptCore/wtf/Platform.h

    r41350 r41431  
    442442#endif
    443443
     444#if !defined(ENABLE_REPAINT_THROTTLING)
     445#define ENABLE_REPAINT_THROTTLING 0
     446#endif
     447
    444448#if !defined(ENABLE_JIT)
    445449/* The JIT is tested & working on x86_64 Mac */
  • trunk/WebCore/ChangeLog

    r41430 r41431  
     12009-03-04  Antti Koivisto  <antti@apple.com>
     2
     3        Reviewed by Dave Hyatt.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=24359
     6        Repaint throttling mechanism
     7       
     8        Excessive repainting can slow down page loadind. This implements a timer
     9        based throttling mechanism. It is behind ENABLE(REPAINT_THROTTLING) and not
     10        enabled by default.
     11
     12        * loader/FrameLoader.cpp:
     13        (WebCore::FrameLoader::checkCompleted):
     14        * page/EventHandler.cpp:
     15        (WebCore::EventHandler::dispatchDragEvent):
     16        (WebCore::EventHandler::dispatchMouseEvent):
     17        (WebCore::EventHandler::keyEvent):
     18        (WebCore::EventHandler::handleTextInputEvent):
     19        * page/FrameView.cpp:
     20        (WebCore::FrameView::FrameView):
     21        (WebCore::FrameView::reset):
     22        (WebCore::FrameView::repaintContentRectangle):
     23        (WebCore::FrameView::beginDeferredRepaints):
     24        (WebCore::FrameView::endDeferredRepaints):
     25        (WebCore::FrameView::checkStopDelayingDeferredRepaints):
     26        (WebCore::FrameView::doDeferredRepaints):
     27        (WebCore::FrameView::updateDeferredRepaintDelay):
     28        (WebCore::FrameView::resetDeferredRepaintDelay):
     29        (WebCore::FrameView::adjustedDeferredRepaintDelay):
     30        (WebCore::FrameView::deferredRepaintTimerFired):
     31        (WebCore::FrameView::paintContents):
     32        * page/FrameView.h:
     33
    1342009-03-04  Sam Weinig  <sam@webkit.org>
    235
  • trunk/WebCore/loader/FrameLoader.cpp

    r41430 r41431  
    12141214void FrameLoader::checkCompleted()
    12151215{
     1216    if (m_frame->view())
     1217        m_frame->view()->checkStopDelayingDeferredRepaints();
     1218
    12161219    // Any frame that hasn't completed yet?
    12171220    for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling())
  • trunk/WebCore/page/EventHandler.cpp

    r40919 r41431  
    13341334bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTarget, const PlatformMouseEvent& event, Clipboard* clipboard)
    13351335{
     1336    m_frame->view()->resetDeferredRepaintDelay();
     1337
    13361338    IntPoint contentsPos = m_frame->view()->windowToContents(event.pos());
    13371339   
     
    15411543bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targetNode, bool /*cancelable*/, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder)
    15421544{
     1545    m_frame->view()->resetDeferredRepaintDelay();
     1546
    15431547    updateMouseEventTargetNode(targetNode, mouseEvent, setUnder);
    15441548
     
    17971801    if (!node)
    17981802        return false;
     1803   
     1804    m_frame->view()->resetDeferredRepaintDelay();
    17991805
    18001806    // FIXME: what is this doing here, in keyboard event handler?
     
    21312137    if (!target)
    21322138        return false;
     2139   
     2140    m_frame->view()->resetDeferredRepaintDelay();
    21332141
    21342142    RefPtr<TextEvent> event = TextEvent::create(m_frame->domWindow(), text);
  • trunk/WebCore/page/FrameView.cpp

    r41338 r41431  
    3030#include "CSSStyleSelector.h"
    3131#include "ChromeClient.h"
     32#include "DocLoader.h"
    3233#include "EventHandler.h"
    3334#include "FloatRect.h"
     
    6263double FrameView::sCurrentPaintTimeStamp = 0.0;
    6364
     65#if ENABLE(REPAINT_THROTTLING)
     66// Normal delay
     67static const double deferredRepaintDelay = 0.025;
     68// Negative value would mean that first few repaints happen without a delay
     69static const double initialDeferredRepaintDelayDuringLoading = 0;
     70// The delay grows on each repaint to this maximum value
     71static const double maxDeferredRepaintDelayDuringLoading = 2.5;
     72// On each repaint the delay increses by this amount
     73static const double deferredRepaintDelayIncrementDuringLoading = 0.5;
     74#else
     75// FIXME: Repaint throttling could be good to have on all platform.
     76// The balance between CPU use and repaint frequency will need some tuning for desktop.
     77// More hooks may be needed to reset the delay on things like GIF and CSS animations.
     78static const double deferredRepaintDelay = 0;
     79static const double initialDeferredRepaintDelayDuringLoading = 0;
     80static const double maxDeferredRepaintDelayDuringLoading = 0;
     81static const double deferredRepaintDelayIncrementDuringLoading = 0;
     82#endif
     83
    6484struct ScheduledEvent {
    6585    RefPtr<Event> m_event;
     
    85105    , m_wasScrolledByUser(false)
    86106    , m_inProgrammaticScroll(false)
     107    , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired)
    87108    , m_shouldUpdateWhileOffscreen(true)
    88109{
     
    109130    , m_wasScrolledByUser(false)
    110131    , m_inProgrammaticScroll(false)
     132    , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired)
    111133    , m_shouldUpdateWhileOffscreen(true)
    112134{
     
    161183    m_deferringRepaints = 0;
    162184    m_repaintCount = 0;
    163     m_repaintRect = IntRect();
    164185    m_repaintRects.clear();
     186    m_deferredRepaintDelay = initialDeferredRepaintDelayDuringLoading;
     187    m_deferredRepaintTimer.stop();
     188    m_lastPaintTime = 0;
    165189    m_paintRestriction = PaintRestrictionNone;
    166190    m_isPainting = false;
     
    704728    ASSERT(!m_frame->document()->ownerElement());
    705729
    706     if (m_deferringRepaints && !immediate) {
     730    double delay = adjustedDeferredRepaintDelay();
     731    if ((m_deferringRepaints || m_deferredRepaintTimer.isActive() || delay) && !immediate) {
    707732        IntRect visibleContent = visibleContentRect();
    708733        visibleContent.intersect(r);
    709         if (!visibleContent.isEmpty()) {
    710             m_repaintCount++;
    711             m_repaintRect.unite(r);
    712             if (m_repaintCount == cRepaintRectUnionThreshold)
    713                 m_repaintRects.clear();
    714             else if (m_repaintCount < cRepaintRectUnionThreshold)
    715                 m_repaintRects.append(r);
     734        if (visibleContent.isEmpty())
     735            return;
     736        if (m_repaintCount == cRepaintRectUnionThreshold) {
     737            IntRect unionedRect;
     738            for (unsigned i = 0; i < cRepaintRectUnionThreshold; ++i)
     739                unionedRect.unite(m_repaintRects[i]);
     740            m_repaintRects.clear();
     741            m_repaintRects.append(unionedRect);
    716742        }
     743        if (m_repaintCount < cRepaintRectUnionThreshold)
     744            m_repaintRects.append(r);
     745        else
     746            m_repaintRects[0].unite(r);
     747        m_repaintCount++;
     748   
     749        if (!m_deferringRepaints && !m_deferredRepaintTimer.isActive())
     750             m_deferredRepaintTimer.startOneShot(delay);
    717751        return;
    718752    }
     
    731765
    732766    m_deferringRepaints++;
    733     m_repaintCount = 0;
    734     m_repaintRect = IntRect();
    735     m_repaintRects.clear();
    736767}
    737768
     
    744775
    745776    ASSERT(m_deferringRepaints > 0);
    746     if (--m_deferringRepaints == 0) {
    747         if (m_repaintCount >= cRepaintRectUnionThreshold)
    748             repaintContentRectangle(m_repaintRect, false);
    749         else {
    750             unsigned size = m_repaintRects.size();
    751             for (unsigned i = 0; i < size; i++)
    752                 repaintContentRectangle(m_repaintRects[i], false);
    753             m_repaintRects.clear();
    754         }
    755     }
    756 }
     777
     778    if (--m_deferringRepaints)
     779        return;
     780   
     781    if (m_deferredRepaintTimer.isActive())
     782        return;
     783
     784    if (double delay = adjustedDeferredRepaintDelay()) {
     785        m_deferredRepaintTimer.startOneShot(delay);
     786        return;
     787    }
     788   
     789    doDeferredRepaints();
     790}
     791
     792void FrameView::checkStopDelayingDeferredRepaints()
     793{
     794    if (!m_deferredRepaintTimer.isActive())
     795        return;
     796
     797    Document* document = m_frame->document();
     798    if (document && (document->parsing() || document->docLoader()->requestCount()))
     799        return;
     800   
     801    m_deferredRepaintTimer.stop();
     802
     803    doDeferredRepaints();
     804}
     805   
     806void FrameView::doDeferredRepaints()
     807{
     808    ASSERT(!m_deferringRepaints);
     809    if (isOffscreen() && !shouldUpdateWhileOffscreen()) {
     810        m_repaintRects.clear();
     811        m_repaintCount = 0;
     812        return;
     813    }
     814    unsigned size = m_repaintRects.size();
     815    for (unsigned i = 0; i < size; i++)
     816        ScrollView::repaintContentRectangle(m_repaintRects[i], false);
     817    m_repaintRects.clear();
     818    m_repaintCount = 0;
     819   
     820    updateDeferredRepaintDelay();
     821}
     822
     823void FrameView::updateDeferredRepaintDelay()
     824{
     825    Document* document = m_frame->document();
     826    if (!document || (!document->parsing() && !document->docLoader()->requestCount())) {
     827        m_deferredRepaintDelay = deferredRepaintDelay;
     828        return;
     829    }
     830    if (m_deferredRepaintDelay < maxDeferredRepaintDelayDuringLoading) {
     831        m_deferredRepaintDelay += deferredRepaintDelayIncrementDuringLoading;
     832        if (m_deferredRepaintDelay > maxDeferredRepaintDelayDuringLoading)
     833            m_deferredRepaintDelay = maxDeferredRepaintDelayDuringLoading;
     834    }
     835}
     836
     837void FrameView::resetDeferredRepaintDelay()
     838{
     839    m_deferredRepaintDelay = 0;
     840    if (m_deferredRepaintTimer.isActive())
     841        m_deferredRepaintTimer.startOneShot(0);
     842}
     843
     844double FrameView::adjustedDeferredRepaintDelay() const
     845{
     846    if (!m_deferredRepaintDelay)
     847        return 0;
     848    double timeSinceLastPaint = currentTime() - m_lastPaintTime;
     849    return max(0., m_deferredRepaintDelay - timeSinceLastPaint);
     850}
     851   
     852void FrameView::deferredRepaintTimerFired(Timer<FrameView>*)
     853{
     854    doDeferredRepaints();
     855}   
    757856
    758857void FrameView::layoutTimerFired(Timer<FrameView>*)
     
    12251324        document->invalidateRenderedRectsForMarkersInRect(rect);
    12261325    contentRenderer->layer()->paint(p, rect, m_paintRestriction, eltRenderer);
    1227        
     1326   
    12281327    m_isPainting = false;
     1328    m_lastPaintTime = currentTime();
    12291329
    12301330#if ENABLE(DASHBOARD_SUPPORT)
  • trunk/WebCore/page/FrameView.h

    r40675 r41431  
    150150    void beginDeferredRepaints();
    151151    void endDeferredRepaints();
     152    void checkStopDelayingDeferredRepaints();
     153    void resetDeferredRepaintDelay();
    152154
    153155#if ENABLE(DASHBOARD_SUPPORT)
     
    204206    virtual void contentsResized() { setNeedsLayout(); }
    205207    virtual void visibleContentsResized() { layout(); }
     208   
     209    void deferredRepaintTimerFired(Timer<FrameView>*);
     210    void doDeferredRepaints();
     211    void updateDeferredRepaintDelay();
     212    double adjustedDeferredRepaintDelay() const;
    206213
    207214    static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
     
    255262    unsigned m_deferringRepaints;
    256263    unsigned m_repaintCount;
    257     IntRect m_repaintRect;
    258264    Vector<IntRect> m_repaintRects;
     265    Timer<FrameView> m_deferredRepaintTimer;
     266    double m_deferredRepaintDelay;
     267    double m_lastPaintTime;
    259268
    260269    bool m_shouldUpdateWhileOffscreen;
Note: See TracChangeset for help on using the changeset viewer.