我有一个自定义的QML组件来绘制从QQuickPaintedItem
派生的图。在绘制方法中,我遍历坐标列表并绘制它们。我的paint()
如下
QRectF bounds = boundingRect();
float w = bounds.width();
float h = bounds.height();
float dx = w / listSize;
for(int i = 0; i < coordinatesList.size() - 1; ++i)
{
QPointF m_p1(dx*i, (h/2)-(coordinatesList.at(i)*(h/4)));
QPointF m_p2(dx*(i+1), (h/2)-(coordinatesList.at(i+1)*(h/4)));
painter->drawLine(m_p1, m_p2);
}
有没有什么方法可以保留以前绘制的点,这样我就不必重新绘制整个点列表,而只需要重新绘制特定的点?
我现在不能测试它,但你可以在QPixmap
上画出所有的点
m_pixmap.fill();
QPainter buffer(&m_pixmap);
....
buffer->drawLine(...);
...
然后在CCD_ 4上绘制保存的像素图。
painter->drawPixmap(0, 0, m_pixmap);
在下一次绘制请求时,您只需绘制保存的QPixmap
。只有当绘图发生变化时,才必须重新绘制QPixmap
本身。
正如第一个答案所示,缓存是关键,然而,使用默认情况下,这将使用光栅绘制器后端,这不是最佳的,因为这将涉及昂贵的ram到GPU ram传输。此外,虽然光栅绘制器提供了更好的质量,但它通常比GL后端慢。QPixmap
如果效率是关键,那么正确的方法是使用QOpenGLFramebufferObject
,用QPainter
和QOpenGLPaintDevice
在其上绘制,并且在QQuickPaintedItem::paint()
中,使用本地渲染在使用FBO目标本身的QQuickItem
上绘制FBO。这将为您提供更好的绘画性能,并避免ram到vram传输的开销。
此外,在处理绘图组件时,最好将图形划分开来,例如,网格或比例等内容应该是单独的组件,因为它们不需要不断重新绘制,只需要绘制实际波形并在顶部组合。