Russian Qt Forum
Сентябрь 22, 2024, 06:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Real time plotter  (Прочитано 6663 раз)
ksanto
Гость
« : Март 03, 2011, 20:19 »

Есть задача: сделать виджет, который будет строить график, добавляя значения в реальном времени с периодом ~250мс. Причем задача может двух видов:
- один график с фиксированным временным интервалом - для просмотра переходных процессов под одному каналу.
- несколько параллельных графиков, расположенных друг под другом, где значения добавляются одновременно для всех. Временной отрезок может быть произвольной длины (конечно, ограничен максимальным значением).
Какие советы по его реализации можете предложить?

Мое видение реализации таково...
Прочитав документацию по QPainter и статьи на тему Qt Graphics and Performance, для себя решил, чтобы буду использовать графическую систему raster  (QApplication::setGraphicsSystem). Реализовать сам график буду в виде двух объектов QImage или QPixmap. Один предполагается отрисовывать только один раз при инициализации объекта - подложка с осями и подписями (либо для одного графика фиксированной длины можно вообще загружать эту подложку в виде .png картинки - есть ли смысл?). Второй постоянно отрисовывать (или дорисовывать если это возможно)  по приходу paintEvent (будет вызываться update() по поступлению новых данных). Далее накладывать второй на первый в режиме QPainter::CompositionMode_SourceOver (этот режим, как я понял, один из самых производительных).

Вопросы в следующем (не до конца понял из прочитанного)....
Что лучше использовать QImage или QPixmap для прорисовки и вывода на экран. Из документации следует, что быстрее графическая система работает для формата QImage::Format_ARGB32_Premultiplied (который задается для объектов QImage), НО выводить на экран быстрее функцией drawPixmap(), чем drawImage(). В случае использования QImage c drawPixmap(), потребуется конвертация в QPixmap. Насколько она дорого будет стоить и есть ли смысл таким образом реализовывать? Может проще drawPixmap()+QPixmap или drawImage() + QImage?

Может быть существуют готовые виджеты для графиков, обновляющихся в реальном времени с высокой частотой?

Спасибо за внимание.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Март 03, 2011, 21:53 »

250 мс - это 4 раза в секунду? Я бы на таких таймингах вообще о производительности думал бы на последних этапах - во всяком случае уж разницы между QPixmap и QImage тут не увидеть никак.
Записан
ksanto
Гость
« Ответ #2 : Март 03, 2011, 22:21 »

Да, 4Гц. Ну так в программе-то не только это делается, а еще много чего. И еще представьте, что, например, этих каналов 15 штук и максимальная длина 1200 секунд и это нужно постоянно отрисовывать в реальном времени без лагов.
Кроме того, хотелось для себя принципиально решить этот вопрос - как правильно и максимально производительно? В документации и различных статьях много чего написано.
Записан
twp
Гость
« Ответ #3 : Март 04, 2011, 11:56 »

Может быть существуют готовые виджеты для графиков, обновляющихся в реальном времени с высокой частотой?

QWT
Записан
ksanto
Гость
« Ответ #4 : Март 04, 2011, 12:59 »

Я уже смотрел на QWT, но не подходит он мне. Особенно для случая большого количества графиков.
Записан
Akon
Гость
« Ответ #5 : Март 04, 2011, 13:33 »

Не мог бы вкратце сказать, почему не подходит Qwt?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Март 04, 2011, 13:50 »

Цитировать
Что лучше использовать QImage или QPixmap для прорисовки и вывода на экран.
Если будете использовать composing (сглаживание или альфа-канал), то пользоваться только QImage, т.к. Qt композинг делает только с QImage.
Да и вообще, QPixmap нужно использовать только для статических картинок.
Записан

Qt 5.11/4.8.7 (X11/Win)
ksanto
Гость
« Ответ #7 : Март 04, 2011, 14:31 »

Не мог бы вкратце сказать, почему не подходит Qwt?
Все очень просто - там каждый график рисуется отдельно со своими осями, подписями и тп. А мне нужно чтобы они были совмещенными. Кроме того, API уже сделан и не так просто что-то изменить под себя, под конкретные цели. Да и ради этого вкомпилировать в свой проект в принципе немаленькую библиотеку не очень хочется. QWT достаточно мощная вещь и 95% ее у меня просто не будет использоваться, а при этом то, что мне нужно, придется все равно самому переписывать.
Записан
Akon
Гость
« Ответ #8 : Март 04, 2011, 15:00 »

ОК, спасибо за ответ.

Может, я несколько не понял? В Qwt также совмещаются графики. В одном плоте (QwtPlot) может быть несколько графиков (QwtPlotCurve), смотри вложение. Размер релизной длл-ки Qwt 5.2.0 ~ 700 кБ.

Просто сам испльзовал Qwt для отрисовки сигналов в реальном времени, но с частотами вплоть до десятков Герц. Около 90% ресурсов в моей программе потребляла Qwt-отрисовка. В конечном счете результат меня устроил.
Записан
ksanto
Гость
« Ответ #9 : Март 04, 2011, 15:11 »

Да, я знаю, что на одном их может быть много. Я библиотекой пользовался и разбирался в ней. Но мне нужно, чтобы их было параллельно около 15 штук один под другим, у каждого свои пределы по оси Y. При этом по оси X у всех одно и то же - время. Позволить при этом Qwt-отрисовке потреблять так много ресурсов я не могу.
Да, она, когда собрана, не такая уж и большая, но все же это сторонняя библиотека, которая почти не будет при этом использоваться.
Спасибо за предложенный вариант.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.