[Interest] Qml Canvas is too slow

Nuno Santos nunosantos at imaginando.pt
Thu Oct 31 17:52:13 CET 2019


Alexander,

You should use QtQuick Scene Graph. It will be 100x faster.

Look for examples on QtCreator under the welcome tab. Use the search input box and write “scene graph”.

Scene Graph - Custom Geometry
Scene Graph - Graph

If it is the first time, it might look confusing but it will pay off.

Best,

Nuno

> On 31 Oct 2019, at 16:42, Alexander Dyagilev <alervdvcw at gmail.com> wrote:
> 
> Hello,
> 
> The following code is too slow (paint operation takes few seconds):
> 
> Canvas {
> 
>         id: map
>         width: columnsCount * rectangleSize
>         height: rowsCount * rectangleSize
>         anchors.horizontalCenter: alignCenter ? parent.horizontalCenter : undefined
>         anchors.left: alignCenter ? undefined : parent.left
>         anchors.bottom: parent.bottom
>         property int offset: 1
>         onPaint: drawMap()
>         function drawMap() {
>             if (columnsCount === 0 || rowsCount === 0) {
>                 return;
>             }
>             var map = downloadProgressMap.map();
>             var ctx = getContext("2d");
>             for (var i = 0; i < map.length; i++) {
>                 var x = (i % columnsCount) * rectangleSize;
>                 var y = (Math.floor(i/columnsCount)) * rectangleSize;
>                 if (map[i]) {
>                     drawFillRect(ctx, x, y);
>                 } else {
>                     drawClearRect(ctx, x, y);
>                 }
>             }
>         }
>         function drawFillRect(ctx, x, y) {
>             ctx.fillStyle = appWindow.theme.progressMapFillBorder
>             ctx.fillRect(x + offset, y + offset, rectangleSize - offset * 2, rectangleSize - offset * 2);
>             ctx.fillStyle = appWindow.theme.progressMapFillBackground
>             ctx.fillRect(x + offset + 1, y + offset + 1, rectangleSize - (offset + 1) * 2, rectangleSize - (offset + 1) * 2);
>         }
>         function drawClearRect(ctx, x, y) {
>             ctx.fillStyle = appWindow.theme.progressMapClearBorder
>             ctx.fillRect(x + offset, y + offset, rectangleSize - offset * 2, rectangleSize - offset * 2);
>             ctx.fillStyle = appWindow.theme.background
>             ctx.fillRect(x + offset + 1, y + offset + 1, rectangleSize - (offset + 1) * 2, rectangleSize - (offset + 1) * 2);
>         }
>     }
> 
> Can anything be done to improve its speed, or should we use c++ instead?
> 
> It paints the following:
> 
> <laaeocmjenhcnjkg.png>
> 
> Map size: 2323 elements.
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20191031/864565fe/attachment.html>


More information about the Interest mailing list