为什么 QCustomPlot 在绘制大数据时速度太慢?
Why QCustomPlot is too slow in ploting large data?
我想绘制每 100 毫秒出现的大量数据 (3k)。我尝试了 QCustomPlot and Qwt 精确的 3k 点,我在使用 Qwt 绘图时表现非常好,而使用 QCustomPlot 时表现非常糟糕。而且我认为我对 QCustomPlot 的行为不正确,我使用此代码在 QCustomPlot 中绘图(此示例来自 QCustomPlot plot-examples,我编辑了函数 setupQuadraticDemo
):
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);
}
和 this code 用于 Qwt。我对 QCustomPlot 做错了吗?为什么绘图太慢了?
我想问题的根源在于代码本身。您正在以错误的方式更新点。您必须从代码中删除以下行
std::srand(std::time(nullptr));
此行将强制 rand()
的种子在确定的时间内固定(如果我想准确地说,你的种子值在 1 second
内是固定的),那么数据本身是否更新与否你看不到任何变化,因为重绘将在该持续时间内绘制相同的点(1 sec
)。
我想绘制每 100 毫秒出现的大量数据 (3k)。我尝试了 QCustomPlot and Qwt 精确的 3k 点,我在使用 Qwt 绘图时表现非常好,而使用 QCustomPlot 时表现非常糟糕。而且我认为我对 QCustomPlot 的行为不正确,我使用此代码在 QCustomPlot 中绘图(此示例来自 QCustomPlot plot-examples,我编辑了函数 setupQuadraticDemo
):
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);
}
和 this code 用于 Qwt。我对 QCustomPlot 做错了吗?为什么绘图太慢了?
我想问题的根源在于代码本身。您正在以错误的方式更新点。您必须从代码中删除以下行
std::srand(std::time(nullptr));
此行将强制 rand()
的种子在确定的时间内固定(如果我想准确地说,你的种子值在 1 second
内是固定的),那么数据本身是否更新与否你看不到任何变化,因为重绘将在该持续时间内绘制相同的点(1 sec
)。