Improve performance of image loading in QML on dual core embedded systems
I was testing QML performance on a dual-core embedded system. I created a grid with 200 items and showed 21 items in the grid. I noticed that while I scroll, the performance wasn't so good. After doing a lot of digging and comparison I got to some conclusion which is a bit odd: during scroll, core 0 is running at 100%. That's fine. The low priority thread that loads the images was running on core 1. This means that the fact that it has a lower priority is meaningless as core 1 was mostly idle so the scheduler was actually letting it run. Every time it finished decoding an image, it copied it to the main thread, which caused a hick-up. I disabled core 1 and scroll performance was MUCH better and images were decoded only when I was not scrolling.
I think a good idea would be to set the affinity of these two threads to the same CPU. That's a temporary fix. I think that a better fix would be that the image loader, would not immediatelly return the job upon complete, but wait for a good time (when no animations are running for example) to copy the images to the main thread. Anyone has other ideas?
Give it a try if you are facing the same issue. If you want to disable a core on linux do the following:
echo 0 > /sys/devices/system/cpu/cpu1/online
A very interesting and important discovery. Thanks!
I think you should consider posting this to "QML mailing list":http://lists.qt-project.org/mailman/listinfo. I assume you are talking about Qt4? Have you tried this with Qt5/ scenegraph?
Yeah, it's qt4. I'm trying to get qt5 working with eglfs.