我想绘制一些大数据块(3k(,它每100ms出现一次。我尝试了精确3k点的QCustomPlot和Qwt,我在用Qwt绘图时得到了非常好的性能,而在用QCustomPlots绘图时却得到了非常差的性能。我认为我在QCustomPlot中的行为是错误的,我在QCCustomPlot中使用了此代码进行绘图(此示例来自我编辑函数setupQuadraticDemo
的QCustomPlot绘图示例(:
void MainWindow::setupQuadraticDemo(QCustomPlot *customPlot)
{
demoName = "Quadratic Demo";
customPlot->addGraph();
customPlot->setNotAntialiasedElements(QCP::AntialiasedElement::aeAll);
customPlot->xAxis->setRange(0, 1000);
customPlot->yAxis->setRange(0, 1000);
customPlot->xAxis->setLabel("x");
customPlot->yAxis->setLabel("y");
connect(&dataTimer, &QTimer::timeout, this, [customPlot]
{
constexpr auto length = 3000;
QVector<double> x(length), y(length);
std::srand(std::time(nullptr));
for (int i = 0; i < length; ++i)
{
x[i] = std::rand() % 1000;
y[i] = std::rand() % 1000;
}
customPlot->graph(0)->setData(x, y, true);
customPlot->replot();
});
dataTimer.start(100);
}
这是Qwt的代码。QCustomPlot我做错了吗?为什么它的策划太慢了?
我想问题的根源在于代码本身。您正在以错误的方式更新点。您必须从代码中删除以下行
std::srand(std::time(nullptr));
这一行将强制rand()
的种子在一段确定的时间内固定(如果我想准确地说,1 second
的种子值是固定的(,所以无论数据本身是否更新,你都看不到任何变化,因为replot将在该持续时间内绘制相同的点(1 sec
(。