Я столкнулся с некоторыми проблемами при разработке встроенного решения на основе Qt для Linux. В основном мое приложение строит график QwtPlot с прикрепленными к нему до 8 QwtPlotCurves. QwtPlot::replot() вызывается каждую секунду. Данные поступают из сокета, подключенного к другому приложению .c в той же системе. Оборудование — техасский OMAP.
Проблема в том, что в зависимости от конфигурации повторение становится очень и очень медленным. Чтобы быть более конкретным, если я поставлю 4 кривых для отображения, задержки не ощущается, но если я прикреплю 8 кривых, то начинает появляться лаг/задержка в 400-500 мс.
Я начал отлаживать систему, чтобы найти, где может быть узкое место (есть 3 этапа: первый получает точки и защищает их во временном буфере с небольшой промежуточной обработкой, второй копирует эти точки в векторы точек графика, а третий похож на таймер, который вызывает QwtPlot::replot() для обновления графика), и после отбрасывания двух первых этапов я подумал, что реальная проблема заключалась в методе replot(): я ожидал, что запуск таймера перед вызовом это и вызов QTime::elapsed(), чтобы узнать, сколько времени это заняло, я найду большое число.
Но неправильно! Метод занимает всего 10-15 мс по сравнению с задержкой в 400-500 мс, с которой я сталкиваюсь. Имея это в виду, я пришел с вопросом: вызывает ли QwtPlot::replot() что-то, чтобы произошло, а затем переходит после этого, поэтому, пока я вычислил 10 мс, мое приложение фактически выполняет много кода, или я должен сделать вывод, что это огромное время, необходимое для перерисовки, является ошибкой оборудования, которое не может справиться с работой должным образом?
Кстати, использование OpenGL (Qwt предлагает такую возможность) может решить мою проблему? Не будет ли у него какой-то недостаток в том, что он убивает процессор для других задач?
ИЗМЕНИТЬ:
- Обс. 1: Что касается OpenGL, я уже узнал (в другом вопросе здесь, в SO), что я не смогу использовать его для конкретной встроенной ситуации, которая у меня есть сейчас, поскольку у моего процессора нет графического процессора и любого другого способа использования OpenGL. на самом деле не было бы полезно (подробности см. по этой ссылке).
- Обс. 2: Обновление повтора выполняется раз в секунду, так что проблема определенно не возникает из-за чрезмерных вызовов повтора, а использование частичного повтора (с помощью QwtPlotDirectPainter или аналогичного) бесполезно.
Обс. 3: К настоящему времени я повторно реализовал метод QwtPlot::replot(), так что теперь он вызывает только 3 метода:
updateAxes(); poCanvas->invalidateBackingStore(); poCanvas->update();