From 84b5ed6e64ef85746477724d97b9b6b20acc3520 Mon Sep 17 00:00:00 2001 From: Soon-Young Lee Date: Tue, 2 Apr 2013 19:58:47 +0900 Subject: [PATCH] Change the deferring delay in LayerFlush from a fixed value to a varying value [Title] Change the deferring delay in LayerFlush from a fixed value to a varying value [Issue#] N/A [Problem] In m.comic.naver.com, the contents are not shown quickly. [Cause] Fixed 0.5s delay in LayerFlush reduces redundant tile repaints so that it can enhance a page loading time. However, it also causes a bad visual responsiveness because the view updates are deferred. [Solution] The deferring delay is redesigned to gradually increase from 0 to 1.3 seconds during page loading. Change-Id: I7f7c687d18425d27d25a956661c2fbcd3beb66f1 --- .../WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp | 9 ++---- .../LayerTreeCoordinator/LayerTreeCoordinator.cpp | 35 ++++++++++++++++++---- .../LayerTreeCoordinator/LayerTreeCoordinator.h | 7 ++++- Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h | 2 +- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp b/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp index 6fd945c..204effd 100644 --- a/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp +++ b/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp @@ -42,11 +42,6 @@ using namespace std; namespace WebKit { -#if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) -static const float defaultLayerFlushDelay = 0.0; -static const float layerFlushDelayDuringLoading = 0.5; -#endif - PassOwnPtr DrawingAreaImpl::create(WebPage* webPage, const WebPageCreationParameters& parameters) { return adoptPtr(new DrawingAreaImpl(webPage, parameters)); @@ -765,7 +760,7 @@ void DrawingAreaImpl::didStartProgress() if (!m_layerTreeHost) return; - m_layerTreeHost->setLayerFlushTimerDelay(layerFlushDelayDuringLoading); + m_layerTreeHost->setDeferLayerFlush(true); } void DrawingAreaImpl::didFinishProgress() @@ -773,7 +768,7 @@ void DrawingAreaImpl::didFinishProgress() if (!m_layerTreeHost) return; - m_layerTreeHost->setLayerFlushTimerDelay(defaultLayerFlushDelay); + m_layerTreeHost->setDeferLayerFlush(false); } #endif diff --git a/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.cpp b/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.cpp index 5cee705..30dadef 100644 --- a/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.cpp +++ b/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.cpp @@ -54,6 +54,10 @@ using namespace WebCore; namespace WebKit { +#if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) +const float LayerTreeCoordinator::s_layerFlushTimerDelayTable[s_layerFlushTimerDelayMaxLevel] = {0, 0.1, 0.2, 0.6, 1.3}; +#endif + PassRefPtr LayerTreeCoordinator::create(WebPage* webPage) { return adoptRef(new LayerTreeCoordinator(webPage)); @@ -89,6 +93,8 @@ LayerTreeCoordinator::LayerTreeCoordinator(WebPage* webPage) , m_layerFlushSchedulingEnabled(true) #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) , m_layerFlushTimerDelay(0.0) + , m_deferLayerFlushEnabled(false) + , m_layerFlushTimerDelayLevel(0) #endif #if ENABLE(TIZEN_WEBKIT2_TILED_AC) , m_suspendedJavaScript(false) @@ -156,15 +162,18 @@ void LayerTreeCoordinator::scheduleLayerFlush() if (!m_layerFlushSchedulingEnabled) return; - if (!m_layerFlushTimer.isActive()) + if (!m_layerFlushTimer.isActive()) { #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) + m_layerFlushTimerDelay = deferredLayerFlushDelay(); m_layerFlushTimer.startOneShot(m_layerFlushTimerDelay); + } #if ENABLE(TIZEN_SYNC_REQUEST_ANIMATION_FRAME) if (m_layerFlushTimerDelay > 0.0) m_webPage->suspendAnimationController(); #endif #else m_layerFlushTimer.startOneShot(0.0); + } #endif #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP) @@ -951,19 +960,35 @@ void LayerTreeCoordinator::setNeedsOneShotDrawingSynchronization() #endif #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) -void LayerTreeCoordinator::setLayerFlushTimerDelay(float delay) +void LayerTreeCoordinator::setDeferLayerFlush(bool deferLayerFlushEnabled) { - if (m_layerFlushTimerDelay != delay && m_layerFlushTimer.isActive()) { + m_deferLayerFlushEnabled = deferLayerFlushEnabled; + m_layerFlushTimerDelayLevel = 0; + double newDelay = deferredLayerFlushDelay(); + + // If the m_layerFlushTimer is already activated, we stop the old timer and then begin the timer with a new delay + if (m_layerFlushTimerDelay != newDelay && m_layerFlushTimer.isActive()) { m_layerFlushTimer.stop(); - m_layerFlushTimer.startOneShot(delay); + m_layerFlushTimer.startOneShot(newDelay); } - m_layerFlushTimerDelay = delay; + m_layerFlushTimerDelay = newDelay; #if ENABLE(TIZEN_SYNC_REQUEST_ANIMATION_FRAME) if (m_layerFlushTimerDelay == 0.0) m_webPage->resumeAnimationController(); #endif } + +float LayerTreeCoordinator::deferredLayerFlushDelay() +{ + if (!m_deferLayerFlushEnabled) + return 0; + + if (m_layerFlushTimerDelayLevel >= s_layerFlushTimerDelayMaxLevel) + m_layerFlushTimerDelayLevel = s_layerFlushTimerDelayMaxLevel - 1; + + return s_layerFlushTimerDelayTable[m_layerFlushTimerDelayLevel++]; +} #endif #if ENABLE(TIZEN_CUTOFF_TILES_OVER_MEMORY_LIMIT) diff --git a/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.h b/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.h index efb2294..b752338 100644 --- a/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.h +++ b/Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.h @@ -159,7 +159,8 @@ private: int compositedContentLayersCount(GraphicsLayer*); #endif #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) - void setLayerFlushTimerDelay(float); + void setDeferLayerFlush(bool deferLayerFlushEnabled); + float deferredLayerFlushDelay(); #endif void scheduleReleaseInactiveAtlases(); @@ -200,6 +201,10 @@ private: bool m_layerFlushSchedulingEnabled; #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) float m_layerFlushTimerDelay; + bool m_deferLayerFlushEnabled; + int m_layerFlushTimerDelayLevel; + static const int s_layerFlushTimerDelayMaxLevel = 5; + static const float s_layerFlushTimerDelayTable[s_layerFlushTimerDelayMaxLevel]; #endif #if ENABLE(TIZEN_WEBKIT2_TILED_AC) diff --git a/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h b/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h index 7d804b2..9a45b2e 100644 --- a/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h +++ b/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h @@ -116,7 +116,7 @@ public: #endif #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING) - virtual void setLayerFlushTimerDelay(float) { } + virtual void setDeferLayerFlush(bool) { } #endif #if PLATFORM(WIN) -- 2.7.4