速度线绘制100000点

时间:2018-07-21 00:46:42

标签: c++ performance graphics qt5

我想绘制〜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();
}

0 个答案:

没有答案