[webkit-qt] Performance (regression?) of window.requestAnimationFrame

Milian Wolff milian.wolff at kdab.com
Wed Mar 13 10:24:14 PDT 2013

Hey all!

As you might have seen on IRC recently, I have hit a big issue in QtWebKit 
when using window.requestAnimationFrame (rAF): Apparently, it triggers a full 
repaint of the web view which can lead to abysmal performance.

To reproduce, see this test code: http://paste.kde.org/~mwolff/695234/

If I open it in Chromium, I cannot notice any performance impact, nor do I see 
a load spike in ksysguard/top or similar.

Now, doing the same in MiniBrowser I see that X starts to use ~20% of CPU and 
MiniBrowser 10%. My system becomes noticeably slugglish (I use KWin as window 
compositor with GPU accelleration enabled). On an embedded device we see a 
demo app using >50% CPU constantly as soon as it uses rAF.

Also looking at the timeline tab in the developer console yields these 
interesting results:

In MiniBrowser: http://imagebin.org/249849
In Chromium: http://imagebin.org/249848

Looking at a cachegrind of MiniBrowser with the above file I see tons of calls 
to QSGRenderer::draw(QSGMaterialShader).

In the code I found this:

void CoordinatedLayerTreeHostProxy::requestAnimationFrame()
    updateViewport(); // <-- does this trigger a repaint of everything?

Furthermore I experimented with the TweenMax [1] JS library and reproduced the 
performance issues there. Interestingly enough, disabling its support for rAF 
via TweenMax.ticker.useRAF(false); made the animations much smoother and 
greatly reduced the System/CPU load. This is in so far interesting, as 
TweenMax uses a window.setTimeout based fallback in such cases. Afaik rAF was 
initially introduced to *improve* the performance of animations compared to 
the timer approach, no?

All this combined brings me to the conclusion that QtWebKit as-is has a big 
performance issue with rAF. On IRC it was said that kbalazs is looking into 
this but I could not get hold of him. Is this true? What's the status? Is 
there anything I could do?

On IRC there was also the mention of "the operationqueue patch" and that it 
may have introduced a regression. Which patch exactly is this so I could try 
to revert to a time before it and see whether it actually is the reason?


[1]: http://www.greensock.com/gsap-js/
Milian Wolff | milian.wolff at kdab.com | Software Engineer
KDAB (Deutschland) GmbH&Co KG, a KDAB Group company
Tel. Germany +49-30-521325470, Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-independent software solutions
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.webkit.org/pipermail/webkit-qt/attachments/20130313/e6c89bbd/attachment.sig>

More information about the webkit-qt mailing list