Changeset 41431 in webkit
- Timestamp:
- Mar 4, 2009 2:01:38 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r41417 r41431 1 2009-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 1 12 2009-03-03 David Kilzer <ddkilzer@apple.com> 2 13 -
trunk/JavaScriptCore/wtf/Platform.h
r41350 r41431 442 442 #endif 443 443 444 #if !defined(ENABLE_REPAINT_THROTTLING) 445 #define ENABLE_REPAINT_THROTTLING 0 446 #endif 447 444 448 #if !defined(ENABLE_JIT) 445 449 /* The JIT is tested & working on x86_64 Mac */ -
trunk/WebCore/ChangeLog
r41430 r41431 1 2009-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 1 34 2009-03-04 Sam Weinig <sam@webkit.org> 2 35 -
trunk/WebCore/loader/FrameLoader.cpp
r41430 r41431 1214 1214 void FrameLoader::checkCompleted() 1215 1215 { 1216 if (m_frame->view()) 1217 m_frame->view()->checkStopDelayingDeferredRepaints(); 1218 1216 1219 // Any frame that hasn't completed yet? 1217 1220 for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) -
trunk/WebCore/page/EventHandler.cpp
r40919 r41431 1334 1334 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTarget, const PlatformMouseEvent& event, Clipboard* clipboard) 1335 1335 { 1336 m_frame->view()->resetDeferredRepaintDelay(); 1337 1336 1338 IntPoint contentsPos = m_frame->view()->windowToContents(event.pos()); 1337 1339 … … 1541 1543 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targetNode, bool /*cancelable*/, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder) 1542 1544 { 1545 m_frame->view()->resetDeferredRepaintDelay(); 1546 1543 1547 updateMouseEventTargetNode(targetNode, mouseEvent, setUnder); 1544 1548 … … 1797 1801 if (!node) 1798 1802 return false; 1803 1804 m_frame->view()->resetDeferredRepaintDelay(); 1799 1805 1800 1806 // FIXME: what is this doing here, in keyboard event handler? … … 2131 2137 if (!target) 2132 2138 return false; 2139 2140 m_frame->view()->resetDeferredRepaintDelay(); 2133 2141 2134 2142 RefPtr<TextEvent> event = TextEvent::create(m_frame->domWindow(), text); -
trunk/WebCore/page/FrameView.cpp
r41338 r41431 30 30 #include "CSSStyleSelector.h" 31 31 #include "ChromeClient.h" 32 #include "DocLoader.h" 32 33 #include "EventHandler.h" 33 34 #include "FloatRect.h" … … 62 63 double FrameView::sCurrentPaintTimeStamp = 0.0; 63 64 65 #if ENABLE(REPAINT_THROTTLING) 66 // Normal delay 67 static const double deferredRepaintDelay = 0.025; 68 // Negative value would mean that first few repaints happen without a delay 69 static const double initialDeferredRepaintDelayDuringLoading = 0; 70 // The delay grows on each repaint to this maximum value 71 static const double maxDeferredRepaintDelayDuringLoading = 2.5; 72 // On each repaint the delay increses by this amount 73 static 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. 78 static const double deferredRepaintDelay = 0; 79 static const double initialDeferredRepaintDelayDuringLoading = 0; 80 static const double maxDeferredRepaintDelayDuringLoading = 0; 81 static const double deferredRepaintDelayIncrementDuringLoading = 0; 82 #endif 83 64 84 struct ScheduledEvent { 65 85 RefPtr<Event> m_event; … … 85 105 , m_wasScrolledByUser(false) 86 106 , m_inProgrammaticScroll(false) 107 , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired) 87 108 , m_shouldUpdateWhileOffscreen(true) 88 109 { … … 109 130 , m_wasScrolledByUser(false) 110 131 , m_inProgrammaticScroll(false) 132 , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired) 111 133 , m_shouldUpdateWhileOffscreen(true) 112 134 { … … 161 183 m_deferringRepaints = 0; 162 184 m_repaintCount = 0; 163 m_repaintRect = IntRect();164 185 m_repaintRects.clear(); 186 m_deferredRepaintDelay = initialDeferredRepaintDelayDuringLoading; 187 m_deferredRepaintTimer.stop(); 188 m_lastPaintTime = 0; 165 189 m_paintRestriction = PaintRestrictionNone; 166 190 m_isPainting = false; … … 704 728 ASSERT(!m_frame->document()->ownerElement()); 705 729 706 if (m_deferringRepaints && !immediate) { 730 double delay = adjustedDeferredRepaintDelay(); 731 if ((m_deferringRepaints || m_deferredRepaintTimer.isActive() || delay) && !immediate) { 707 732 IntRect visibleContent = visibleContentRect(); 708 733 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); 716 742 } 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); 717 751 return; 718 752 } … … 731 765 732 766 m_deferringRepaints++; 733 m_repaintCount = 0;734 m_repaintRect = IntRect();735 m_repaintRects.clear();736 767 } 737 768 … … 744 775 745 776 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 792 void 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 806 void 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 823 void 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 837 void FrameView::resetDeferredRepaintDelay() 838 { 839 m_deferredRepaintDelay = 0; 840 if (m_deferredRepaintTimer.isActive()) 841 m_deferredRepaintTimer.startOneShot(0); 842 } 843 844 double 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 852 void FrameView::deferredRepaintTimerFired(Timer<FrameView>*) 853 { 854 doDeferredRepaints(); 855 } 757 856 758 857 void FrameView::layoutTimerFired(Timer<FrameView>*) … … 1225 1324 document->invalidateRenderedRectsForMarkersInRect(rect); 1226 1325 contentRenderer->layer()->paint(p, rect, m_paintRestriction, eltRenderer); 1227 1326 1228 1327 m_isPainting = false; 1328 m_lastPaintTime = currentTime(); 1229 1329 1230 1330 #if ENABLE(DASHBOARD_SUPPORT) -
trunk/WebCore/page/FrameView.h
r40675 r41431 150 150 void beginDeferredRepaints(); 151 151 void endDeferredRepaints(); 152 void checkStopDelayingDeferredRepaints(); 153 void resetDeferredRepaintDelay(); 152 154 153 155 #if ENABLE(DASHBOARD_SUPPORT) … … 204 206 virtual void contentsResized() { setNeedsLayout(); } 205 207 virtual void visibleContentsResized() { layout(); } 208 209 void deferredRepaintTimerFired(Timer<FrameView>*); 210 void doDeferredRepaints(); 211 void updateDeferredRepaintDelay(); 212 double adjustedDeferredRepaintDelay() const; 206 213 207 214 static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache … … 255 262 unsigned m_deferringRepaints; 256 263 unsigned m_repaintCount; 257 IntRect m_repaintRect;258 264 Vector<IntRect> m_repaintRects; 265 Timer<FrameView> m_deferredRepaintTimer; 266 double m_deferredRepaintDelay; 267 double m_lastPaintTime; 259 268 260 269 bool m_shouldUpdateWhileOffscreen;
Note: See TracChangeset
for help on using the changeset viewer.