How to improve memory-consumption when drawing polygons, (poly-)lines and points
I'm currently struggling with populating a qgraphicsscene with many (> 1Million) objects (Polygons, Lines, Points). What I've observed is, that when creating randomly 100000 Polygons, I'm already ending up withe 130MB memory consumption. (The simple example below is based on a default Qt-Project using the View.cpp of the chip-demo example)
Code:
{
ui.setupUi(this);
vSplitter->addWidget(h1Splitter);
View* view = new View("asdf");
h1Splitter->addWidget(view);
layout->addWidget(vSplitter);
setLayout(layout);
setCentralWidget(view);
brush->setColor(Qt::blue);
brush->setStyle(Qt::SolidPattern);
pen->setWidth(0);
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);
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);
}
So what am I doint wrong here / where can I improve? I've read some posts of creating an own class like the chip-example, so I simply used the chip example but also there I've encountered the problem that as soon as I change the part which uniformly distributes the chips from to a random distribution
Code:
item
->setPos
(QPointF(lBaseX, lBaseY
));
, the memory consumption explodes also here...
So, what is the most performant and least memory-consuming way of drawing polygons, (poly-)lines and points in Qt?
Re: How to improve memory-consumption when drawing polygons, (poly-)lines and points
I guess the most memory efficient way is to draw yourself using the QPainter API.
This way you can work with the data you already have and don't need to copy it.
Alternatively create your own graphics item that does not require a copy of the data but has access to your already existing data.
That will still require at least one pointer for the item, one to point to the global data and some index into the data.
Cheers,
_