QT优化轮廓文字的绘图

时间:2019-01-26 12:53:44

标签: c++ qt qt5

我使用这样的代码绘制轮廓文字:

 painter.setPen(Qt::black);
 painter.setBrush(Qt::white);
 QPainterPath ppath;
 ppath.addText({200., 200.}, font(), line);
 painter.drawPath(ppath);

它有效,但是太慢了... 对于100个字幕,在4GHz CPU上需要30-50毫秒, 这太长了,因为我想要至少10FPS,并且我需要更多的东西 除了字幕的绘制。

有人暗示如何加速代码吗? 我以为Qt有字体缓存, 但是由于某种原因,有50%的程序花在libfreetype代码中的TT_RunIns内部,而我只画数字,所以我认为它应该在几次迭代后缓存所有字形。我可能需要调用一些函数来打开字体缓存吗? 请注意,为简单起见,我在同一位置绘制文本, 当然,在实际程序中,我会以正确的方式做到这一点。

#include <QApplication>
#include <QElapsedTimer>
#include <QPainter>
#include <QTimer>
#include <QWidget>
#include <algorithm>

struct MyW : public QWidget {
  void paintEvent(QPaintEvent *) override {
    QPainter painter{this};
    painter.fillRect(rect(), Qt::red);

    painter.setPen(Qt::black);
    painter.setBrush(Qt::white);

    QVector<QString> lines;
    lines.resize(100);
    std::generate(std::begin(lines), std::end(lines),
                  [] { return QString::number(qrand()); });

    QElapsedTimer timer;
    timer.start();
    for (const auto &line : lines) {
      QPainterPath ppath;
      ppath.addText({200., 200.}, font(), line);
      painter.drawPath(ppath);
    }
    qInfo("paint text takes %d ms", static_cast<int>(timer.elapsed()));
  }
};

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  MyW w;
  w.resize(600, 800);
  w.show();
  QTimer timer;
  QObject::connect(&timer, &QTimer::timeout, &app, [&w] { w.update(); });
  timer.start(1000);
  return app.exec();
}

0 个答案:

没有答案