C++ 10万点速度线图

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

我想画300多条线,每条线上有300个点。 根据我的测量,在不错的笔记本电脑(linux/qt 5.11/i7/16GB/nvidia gpu)上大约需要50毫秒


有没有办法提高绘图速度? 我创建了一个简单的例子来重现我的问题, 在真实的程序中,我在飞行中获得分数, 所以我可以做任何
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();
}