Maybe not as fast or future proof, but Maybe a simple Item Rectangle of each 
type (full and empty) and use a repeater of Qml ShaderEffect {} to duplicate 
the rendering, may lead to decent performance. Not sure if this will be good 
enough.


[36E56279]
une compagnie  [cid:[email protected]]
RAPPROCHEZ LA DISTANCE
Jérôme Godbout
Développeur Logiciel Sénior /
Senior Software Developer
p: +1 (418) 800-1073 ext.:109
amotus.ca<http://www.amotus-solutions.com/>
statum-iot.com<http://statum-iot.com/>
[cid:[email protected]]<https://www.facebook.com/LesSolutionsAmotus/>
 [cid:[email protected]] 
<https://www.linkedin.com/company/amotus-solutions/>  
[cid:[email protected]] <https://twitter.com/AmotusSolutions>  
[cid:[email protected]] 
<https://www.youtube.com/channel/UCoYpQgsmj1iJZyDjTQ3x8Ig>


From: Interest <[email protected]> On Behalf Of Alexander Dyagilev
Sent: October 31, 2019 2:13 PM
To: Nuno Santos <[email protected]>
Cc: [email protected]
Subject: Re: [Interest] Qml Canvas is too slow


Thanks for the answer.

This means I'll have to use c++. But I was asking for a way to stick with a 
pure QML.


On 10/31/2019 7:52 PM, Nuno Santos wrote:
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 
<[email protected]<mailto:[email protected]>> 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
[email protected]<mailto:[email protected]>
https://lists.qt-project.org/listinfo/interest

_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest

Reply via email to