我在使用QT框架时遇到了问题,尤其是paintEvent
的{{1}}。我设置了QWidget
,并且正在覆盖它的QWidget
。我需要渲染一堆矩形(网格系统),51乘19,导致绘制969个矩形。这是在for循环中完成的。然后我还需要在这些网格的每个上面绘制一个图像。 paintEvent
已添加到显示的QWidget
。
这很好用,但是每个窗口打开使用47%的CPU!我希望允许用户打开这样的多个窗口,比如一次打开3-4个,这使CPU接近150%。
为什么会这样?这是QMainWindow
内容。 JNI调用不会导致CPU使用率,注释掉它们不会降低它,但注释掉paintEvent
和p.fillRect
(绘制图像)会将CPU降低到大约5%。 / p>
Renderer::renderString
答案 0 :(得分:0)
你遇到的问题是,每次你在QPainter上调用绘图功能时,它都需要设置画家的开销,特别是当笔和画笔需要改变时。当您调用该函数超过900次时,这超过了Painter需要更改其内部属性以进行渲染的900倍,并解释了为什么注释掉drawRect和drawString函数会降低CPU使用率。
要解决此问题,您需要批量处理所有相同类型的绘制调用,其中类型使用相同的笔刷和笔。为此,您可以使用类QPainterPath并使用addRect(..)等函数添加所需的对象;确保你在绘画功能之外做到这一点!
例如,如果您打算绘制棋盘图案,则会创建两个QPainterPath对象,并将所有白色方块添加到一个,将所有黑色添加到另一个。然后说到绘图使用QPainter函数drawPath。这只需要两次调用来绘制整个电路板。
当然,如果你需要每个方格都是不同的颜色,那么你仍然会遇到同样的问题,在这种情况下,我建议你想要生成一个你需要的图像,然后再渲染它。 / p>