我想绘制〜300条折线,每条折线中包含〜300个点。 根据我的测量,在不错的笔记本电脑(linux / qt 5.11 / i7 / 16GB / nvidia gpu)上大约需要50ms。
有什么方法可以提高绘图速度?
我创建了一个简单的例子来重现我的问题,
在实际程序中,我可以即时获得积分,
因此我可以进行任何QPixmap
缓存等操作。
此示例打印:
地区数:304 最小44,最大1808,平均301 工作时间:54毫秒
#include <QApplication>
#include <QDataStream>
#include <QDebug>
#include <QElapsedTimer>
#include <QFile>
#include <QPainter>
#include <QWidget>
#include <algorithm>
#include <cassert>
#include <cmath>
class MyW final : public QWidget {
public:
MyW(QVector<QVector<QPoint>> &lines) : lines_(lines) {}
void paintEvent(QPaintEvent *) {
QElapsedTimer work_timer;
work_timer.start();
QPainter painter{this};
painter.fillRect(rect(), Qt::gray);
painter.setPen(QPen{Qt::red, 8});
for (const QVector<QPoint> &item : lines_) {
painter.drawPolyline(&item[0], item.size());
}
qInfo() << "time of work: " << work_timer.elapsed() << " ms";
}
private:
QVector<QVector<QPoint>> lines_;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QVector<QVector<QPoint>> lines;
{
QFile f("/tmp/data.txt");
f.open(QIODevice::ReadOnly);
assert(f.isOpen());
QDataStream d(&f);
d >> lines;
assert(!lines.empty());
qInfo() << "number of regions: " << lines.size();
int min = lines[0].size(), max = lines[0].size();
double avg = 0.;
for (const QVector<QPoint> &item : lines) {
min = std::min(item.size(), min);
max = std::max(item.size(), max);
avg += item.size();
}
qInfo() << "min " << min << ", max " << max << ", avg "
<< std::round(avg / lines.size());
}
MyW w{lines};
w.showMaximized();
return app.exec();
}