我使用这样的代码绘制轮廓文字:
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();
}