C++ 10万点速度线图
我想画300多条线,每条线上有300个点。 根据我的测量,在不错的笔记本电脑(linux/qt 5.11/i7/16GB/nvidia gpu)上大约需要50毫秒C++ 10万点速度线图,c++,performance,graphics,qt5,C++,Performance,Graphics,Qt5,我想画300多条线,每条线上有300个点。 根据我的测量,在不错的笔记本电脑(linux/qt 5.11/i7/16GB/nvidia gpu)上大约需要50毫秒 有没有办法提高绘图速度? 我创建了一个简单的例子来重现我的问题, 在真实的程序中,我在飞行中获得分数, 所以我可以做任何QPixmap缓存之类的事情。 此示例打印: 地区数目:304 最小44,最大1808,平均301 工作时间:54毫秒 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 类MyW fin
有没有办法提高绘图速度? 我创建了一个简单的例子来重现我的问题, 在真实的程序中,我在飞行中获得分数, 所以我可以做任何
QPixmap
缓存之类的事情。
此示例打印:
地区数目:304
最小44,最大1808,平均301
工作时间:54毫秒
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类MyW final:publicqwidget{
公众:
MyW(QVector&lines):lines_(lines){}
无效paintEvent(QPaintEvent*){
QEDTimer工作计时器;
work_timer.start();
油漆工{this};
painter.fillRect(rect(),Qt::gray);
画师:setPen(QPen{Qt::red,8});
用于(常数QVector和项:行){
painter.drawPolyline(&item[0],item.size());
}
qInfo()“有什么方法可以提高绘图速度吗?”使用OpenGL/DirectX。@Swardfish但对我来说很奇怪,在当前硬件上,100k点是cpu渲染的极限吗?它受到Qt和WinAPI的限制。我想另一种方法是将行列表分成N个子集(其中N是计算机上的内核数),将每个子集交给不同的线程,让该线程将其绘制成QImage,然后将生成的QImage重新组合在一起(使用alpha通道)转换为QPixmap以在屏幕上渲染。但这是否会更快是一个悬而未决的问题。在显示的代码中,MyW::lines
中的数据已初始化,从未更改。您试图解决的问题是否总是这样?
#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();
}