画布使用大量 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