Change the deferring delay in LayerFlush from a fixed value to a varying value
authorSoon-Young Lee <sy5002.lee@samsung.com>
Tue, 2 Apr 2013 10:58:47 +0000 (19:58 +0900)
committerSoon-Young Lee <sy5002.lee@samsung.com>
Tue, 2 Apr 2013 11:57:13 +0000 (20:57 +0900)
[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

Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp
Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.cpp
Source/WebKit2/WebProcess/WebPage/LayerTreeCoordinator/LayerTreeCoordinator.h
Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h

index 6fd945c..204effd 100644 (file)
@@ -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> 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
 
index 5cee705..30dadef 100644 (file)
@@ -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> 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)
index efb2294..b752338 100644 (file)
@@ -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)
index 7d804b2..9a45b2e 100644 (file)
@@ -116,7 +116,7 @@ public:
 #endif
 
 #if ENABLE(TIZEN_LAYER_FLUSH_THROTTLING)
-    virtual void setLayerFlushTimerDelay(float) { }
+    virtual void setDeferLayerFlush(bool) { }
 #endif
 
 #if PLATFORM(WIN)