画布使用大量 CPU

Posted

技术标签:

【中文标题】画布使用大量 CPU【英文标题】:Canvas uses a lot of CPU 【发布时间】:2013-11-04 09:21:04 【问题描述】:

我在 QML 中使用 Canvas 使用 OpenGL 绘制旋转的 Rectangle。代码如下:

//...
property variant points: []

onPointsChanged:
    canvas.requestPaint();


//...

Canvas
    //...

    onPaint:
        var ctx = canvas.getContext('2d')

        ctx.clearRect(0,0, width, height);
        ctx.beginPath()
        ctx.strokeStyle = 'red'
        ctx.lineWidth = 3

        for(var i = 0; i < points.length; i++)
            var p1 = convertPoint(points[i])
            if(i == 0)
                ctx.moveTo(p1.x, p1.y)
                continue
            

            ctx.lineTo(p1.x, p1.y)
        
        ctx.stroke()
        ctx.restore()
    

    function convertPoint(p)
        var x = p.x * width;
        var y = p.y * height;
        return Qt.point(x,y);
    

在c++代码中有4个点,每30ms发送到qml。问题是在MinGW下编译时,这个绘制操作占用了50%的CPU使用率,而在MSVC2010下编译时,这个操作占用了17%的CPU,这仍然很多。这是一些错误还是什么不好?

【问题讨论】:

如果你在编译时启用了优化? 你能告诉我该怎么做吗? 你可以从这里开始:qt-project.org/forums/viewthread/16833 您如何将积分“发送”到 QML?我让你的示例可运行(为了简单起见,没有 C++,难看的旋转),它消耗大约 10% 的 CPU:pastebin.kde.org/pzgh1x1e1 【参考方案1】:

如果性能至关重要,请考虑使用new scene graph classes 而不是Canvas。特别是,您会对QSGGeometryNode 类感兴趣。如果您更喜欢 Canvas API 的简单性,您必须了解它的最佳使用方式。 This article 让您对此有所了解。

编辑:我还发现在某些情况下使用 QQuickPaintedItem 类对嵌入式硬件(特别是 Raspberry Pi)进行了改进。

【讨论】:

以上是关于画布使用大量 CPU的主要内容,如果未能解决你的问题,请参考以下文章

WebGL - 发送数组缓冲区 VS 将图像/画布/位图从 CPU 发送到 GPU

队列的性能?期望有大量的 RAM 使用,但我却得到大量的 CPU 使用

Cassandra 占用大量 CPU

sh 使用大量CPU / MEM使用来润滑容器

如何缓存或预渲染画布动画

如何使用大量 CPU 快速获取线程的托管堆栈跟踪