Эффективное построение кривой с использованием QwtPlotCurve - PullRequest
0 голосов
/ 05 марта 2019

У меня есть кодовая база, которая строит много кривых, подобных области видимости, используя библиотеку QT.Мы пытаемся оптимизировать время работы этого приложения (потому что мы достигли стены при использовании процессора).После некоторого профилирования я обнаружил, что основной цикл построения данных вызывает эту функцию из библиотеки QWT:

void QwtPlotCurve::setSamples( const QVector<double> &xData, const QVector<double> &yData )
{
    setData( new QwtPointArrayData( xData, yData ) );
}

Это делается каждые 100 мс.В результате каждые 100 мс происходит вызов new для объекта QwtPointArrayData, затем происходит вызов delete для предыдущей версии объекта QwtPointArrayData, для каждой кривой в каждой области.

Мой вопрос: есть ли лучший, более эффективный способ построения графика данных без перераспределения его при каждом обновлении?

1 Ответ

0 голосов
/ 05 марта 2019

Распределение памяти может вызвать серьезные проблемы в любой программе, в зависимости от того, как часто она вызывается.Это очень дорогая инструкция с точки зрения производительности, и всегда следует разрабатывать архитектуру, чтобы этого не происходило.Есть много лучших способов, вам абсолютно не нужно перераспределять новую память для QwtPointArrayData.Посмотрите на примеры библиотеки qwt, такие как oscilloscope или realtime .В основном вы можете использовать QwtDirectPainter и его функцию drawSeries, которая требует в качестве аргументов QPlotCurve и количество выборок, которые вы хотите получить.

https://qwt.sourceforge.io/class_qwt_plot_direct_painter.html

Конечно, вам нужно установить выборки кривой с помощью инструкции setSamples () или setRawSamples

https://qwt.sourceforge.io/class_qwt_plot_curve.html#aa51cd3fa00f2a046ca5a9889c5db2413

Это очень эффективный подход.Но опять же, перейдите в папку examples библиотеки, чтобы найти oscilloscope и realtime примеры, и изучите саму библиотеку, так как могут быть другие подходы, которыеможет подойти вам лучше.

РЕДАКТИРОВАТЬ: Сначала я не понял, что это был фрагмент кода из библиотеки.Я думаю, что вы должны попробовать вместо этого setRawSamples, поскольку он должен быть более эффективным https://qwt.sourceforge.io/class_qwt_plot_curve.html#afd13c94e23520dacbc37b4d0fd036a8b

...