Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: once_again_abc от Август 18, 2011, 15:13



Название: Вот такая задача - поделитесь опытом
Отправлено: once_again_abc от Август 18, 2011, 15:13

Есть некое устройство, генерящее поток (скажем 30000 значений в секунду) однородных данных в некотором диапазоне (например [-10:+10]).
Есть некое Qt приложение, которое должно принимать этот поток данных и отрисовывать их в виде графиков (на одном виджете в одной системе координат).
Обязательно нужно динамическое масштабирование картинки.
Чрезвычайно важна точность рисования/разрешение - при этом нужно как-то найти компромисс с производительностью т.к. еще _очень_ важна максимально возможная скорость отрисовки для точной и своевременной реакции пользователя на события.
Очень нужна возможность выделять регион и увеличивать/уменьшать его масштаб с соответствующей детализацией выделенных участк(-а-)ов графика.

С Qt я почти не знаком, изучаю его пару недель. Т.е. мне по идее все равно, что сейчас изучать с нуля - Qt QPainter, etc. или QWT и соответствующие классы либо вообще что-то другое, что можно использовать внутри Qt (для кросс-платформенности).

И еще важный момент - мне необходимо предоставить первую работающую версию в кратчайшие сроки.


Вопросы следующие:

1. Какой наиболее подходящий инструмент для решения такой задачи вообще, в принципе (в контексте Qt)?
2. Какое может быть наиболее адекватное решение в моей конкретной ситуации (упрощенно - что делать, куда бежать)?

Спасибо!


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: once_again_abc от Август 18, 2011, 15:43
еще нашел вот эти библиотеки:

http://plplot.sourceforge.net/
и
http://mathgl.sourceforge.net/

также работают с Qt.

Очень нуждаюсь в советах тех, кто уже решал подобные задачи, неважно - успешно или нет.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: gavlig от Август 18, 2011, 23:07
Сам сейчас мучаюсь с максимально оптимальной отрисовкой. Посоветовали QGraphicsView, подробно почитать можно в assistant в статье Graphics View Framework. Только вот предупреждаю, что если сцену надо часто скроллить, этот фреймворк неиллюзорно грузит проц, вне зависимости от того, кто отрисовывает вьюпорт - опенгл или нет.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: once_again_abc от Август 19, 2011, 01:06
странно, что бывалые молчат =)


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: Prm от Август 19, 2011, 06:59
Смотрите в сторону Qwt. Вроде достаточно шустро работает. Плюс имеет весь интересующий функционал(увеличение, выделение области).


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: Sancho_s_rancho от Август 19, 2011, 09:34
Я в бывалые записываться не буду, но отвечу.
Средний монитор имеет ширину от 1000 до 2000 точек. Соответственно вам хочется ежесекундно обновлять от 15 до 30 графиков на всю ширину экрана. А приступ эпилепсии не начнется? И еще надо какая-то точность. Судя по всему за монитором будет сидеть супермен. Скорее всего задача поставлена неверно.
И второе. НЕ ИСПОЛЬЗУЙТЕ QGraphicsView для такого рода задач. Он предназначен для графики, а не для графиков. Производительность просядет, а код станет только сложнее.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: Sancho_s_rancho от Август 19, 2011, 09:40

Вопросы следующие:

1. Какой наиболее подходящий инструмент для решения такой задачи вообще, в принципе (в контексте Qt)?
2. Какое может быть наиболее адекватное решение в моей конкретной ситуации (упрощенно - что делать, куда бежать)?

Спасибо!
1. С QPainter буде все проще и гибче.
2. Изучить Qt и написать виджет самостоятельно. Если проект развивать не планируется, то можно взять чтото готовое, типа qwt. Ну или заплатить мне и я все сделаю.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: gavlig от Август 19, 2011, 11:23
Я в бывалые записываться не буду, но отвечу.
Средний монитор имеет ширину от 1000 до 2000 точек. Соответственно вам хочется ежесекундно обновлять от 15 до 30 графиков на всю ширину экрана. А приступ эпилепсии не начнется? И еще надо какая-то точность. Судя по всему за монитором будет сидеть супермен. Скорее всего задача поставлена неверно.
И второе. НЕ ИСПОЛЬЗУЙТЕ QGraphicsView для такого рода задач. Он предназначен для графики, а не для графиков. Производительность просядет, а код станет только сложнее.

Скажите, пожалуйста, если не секрет, что лучше использовать для динамической отрисовки? QPainter - единственный вариант(в рамках Qt, естественно) или есть другие альтернативы?


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: Sancho_s_rancho от Август 19, 2011, 11:38
Если речь идет о графиках, то QPainter.
Если что-то типа casual game (не знаю, как это у геймеров по-русски называется) или заковыристого интерфейса пользователя, то  или Graphics Framework или qml. QML при желании можно сдобрить С++ и QPainter. Там все органично связывается. В общем, зависит от задачи.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: Странник от Август 19, 2011, 14:40
на заре своей Qt-карьеры решал подобную задачу (прием данных из COM-порта с детекцией ошибок и цифровой фильтрацией + визуализация на нескольких графиках в реальном времени с возможностью масштабирования, в том числе автоматического подбора оптимального масштаба и шага сетки). приличных готовых решений тогда не нашел, реализовал на QPainter - с производительностью проблем не было, частота входного сигнала правда была порядка на три поменьше = ) времени на все ушло две недели, с Qt до этого всерьез не сталкивался.

если решитесь писать сами - посмотрите пример plotter из главы 5 книги Бланшета и Саммерфилда "Qt 4 программирование GUI на C++", местами похоже на вашу задачу. исходники примера во вложении.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: once_again_abc от Август 20, 2011, 03:11
ОГРОМНЕЙШЕЕ ВАМ всем спасибо за советы!

проект сложный и расчитан на несколько лет. будет развиваться и расширяться. задачу я здесь описал несколько упрощенно, на самом деле все несколько сложнее. но на данном этапе такое приближение вполне для нас достаточно.
делать все это нужно мне самому, так что мне предстоит расти вместе с проектом и знаниями о Qt и в частности о графике в Qt.
соответственно будут глупые вопросы, но постараюсь не надоедать слишком сильно =)

Спасибо!


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: gavlig от Август 20, 2011, 10:50
Вам бы какой-нибудь блог завести и по мере развития проекта рассказывать нам о достигнутом. Мне было бы очень интересно :)


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: once_again_abc от Август 22, 2011, 01:55
Вам бы какой-нибудь блог завести и по мере развития проекта рассказывать нам о достигнутом. Мне было бы очень интересно :)

честно признаюсь, я ленивый в этом отношении. но я подумаю =)


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: GreatSnake от Август 22, 2011, 12:37
Ежели не будет задействован OpenGL, то нужно иметь в виду, что отрисовка ломаных линий с большим количеством точек со сглаживанием под виндой будет очень сильно тормозить.


Название: Re: Вот такая задача - поделитесь опытом
Отправлено: once_again_abc от Сентябрь 27, 2011, 16:29
еще раз хочу сказать спасибо за советы.
выбранный мною путь оказался верным. задача блестяще решена. никаких тормозов, точность максимально возможная (вплоть до одного сэмпла сигнала). 32 канала прекрасно отрисовываются на максимальном разрешении с сэмплингом данных до 250000/сек. работает масштабирование, перемещение вдоль "свипа", зум...
если кто-то будет реализовывать подобную задачу, рекомендую использовать QImage + QPainter + QThread. производительность просто аццкая. достаточно даже drawPolyline на 32 массива точек.