在Qt中绘制多边形,(poly)线和点时,如何提高内存消耗?

时间:2013-11-12 09:34:00

标签: c++ windows qt qgraphicsitem qgraphicsscene

我目前正在努力填充qgraphicsscene与许多(> 1亿)对象(多边形,线,点)。我观察到的是,当创建随机的100000个多边形时,我已经最终消耗了130MB的内存。 (下面的简单示例基于使用芯片演示示例的View.cpp的默认Qt-Project)

QtGrafikTestBasic::QtGrafikTestBasic(QWidget *parent): QMainWindow(parent)
{
    ui.setupUi(this);
    QSplitter *h1Splitter = new QSplitter;
    QSplitter *vSplitter = new QSplitter;
    vSplitter->addWidget(h1Splitter);

    View* view = new View("asdf");
    h1Splitter->addWidget(view);

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(vSplitter);
    setLayout(layout);
    setCentralWidget(view);

    QBrush *brush = new QBrush();
    brush->setColor(Qt::blue);
    brush->setStyle(Qt::SolidPattern);
    QPen *pen = new QPen();
    pen->setWidth(0);

    QGraphicsScene *scene = new QGraphicsScene;
    srand ( time(NULL) );
    int m_PolyWidth = 10;

    for (int i = 0 ; i < 100000; i++)
    {
        double lBaseX = rand() % ((int)floor(width())  - m_PolyWidth);
        double lBaseY = rand() % ((int)floor(height()) - m_PolyWidth);

        QPolygonF polygon;
        polygon << QPointF(lBaseX, lBaseY);
        polygon << QPointF(lBaseX + m_PolyWidth, lBaseY);
        polygon << QPointF(lBaseX + m_PolyWidth, lBaseY + m_PolyWidth);
        polygon << QPointF(lBaseX, lBaseY + m_PolyWidth);

        scene->addPolygon(polygon, *pen, *brush);
    }
    view->view()->setScene(scene);
 }

那么我在这里做错了什么/哪里可以改进?我已经阅读了一些关于创建自己的类的帖子,比如芯片示例,所以我只是使用了芯片示例,但在那里我遇到了问题,一旦我更改了从{{1分布均匀分布芯片的部分随机分布item->setPos(QPointF(i, j));,内存消耗也在这里爆炸......

那么,在Qt中绘制多边形,(多边形)线和点的性能最高且耗费内存最少的方法是什么?

1 个答案:

答案 0 :(得分:1)

当您在图形场景上调用addPolygon时,它会创建一个QGraphicsPolygonItem并将其添加到场景中。

您添加的每个项目都有各种属性,包括位置,方向,画笔,笔,并允许场景处理碰撞检测。此外,每个项目都将调用其绘制函数,这是一个相当大的开销。

这里要做的第一件事是看看使用QPainterPath可以获得什么样的性能。创建一个QPainterPath并将多边形添加到: -

QPainterPath* painterPath = new QPainterPath;
for (int i = 0 ; i < 100000; i++)
{
    double lBaseX = rand() % ((int)floor(width())  - m_PolyWidth);
    double lBaseY = rand() % ((int)floor(height()) - m_PolyWidth);

    QPolygonF polygon;
    polygon << QPointF(lBaseX, lBaseY);
    polygon << QPointF(lBaseX + m_PolyWidth, lBaseY);
    polygon << QPointF(lBaseX + m_PolyWidth, lBaseY + m_PolyWidth);
    polygon << QPointF(lBaseX, lBaseY + m_PolyWidth);

    painterPath->addPolygon(polygon);
}

如果将painterPath添加到从QGraphicsItem派生的类中,则可以使painterPath在项目的绘制函数中绘制: -

 painter.drawPath(painterPath);

这会快得多。只是确保您没有将多边形添加到paint函数内的painter路径。 paint函数不应该执行任何操作,但渲染项目。