我目前正在努力填充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中绘制多边形,(多边形)线和点的性能最高且耗费内存最少的方法是什么?
答案 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函数不应该执行任何操作,但渲染项目。