gpt4 book ai didi

c++ - 在 Qt 中绘制多边形、(多边形)线和点时如何改善内存消耗?

转载 作者:行者123 更新时间:2023-11-28 07:18:04 31 4
gpt4 key购买 nike

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

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);
}

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

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

最佳答案

当您在图形场景上调用 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 函数应该不做任何事情,而是渲染项目。

关于c++ - 在 Qt 中绘制多边形、(多边形)线和点时如何改善内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925510/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com