Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: bigirbis от Апрель 05, 2007, 16:08



Название: Qwt real time
Отправлено: bigirbis от Апрель 05, 2007, 16:08
Как при скроллировании любой из осей не использовать replot?


Название: Qwt real time
Отправлено: Admin от Апрель 05, 2007, 16:17
поподробне
там есть у plot свойтство типа autoreplot

перерисовыввать при изменениях или нет

а вам что хочется?


Название: Qwt real time
Отправлено: bigirbis от Апрель 05, 2007, 18:02
Исходные данные:
регистрация сигналов через usb порт
Скорость обновления - 10 Гц.
Количество одновременно отображаемых точек на плоте - до 500 на одну кривую.
Количество кривых - до 4.
Текущая реализация:
на каждую кривую объявлены динамические массивы, связанные с кривыми с помощью QwtPlot::setRawData(..).
При приходе новой партии массивы сдвигаются влево с помощью memcpy на количество пришедших данных.
В конец массива дописываются пришедшие данные. Высталяются границы QwtPlot::setAxisScale(QwtPlot::xBottom,
левая граница массива, правая граница массива). После чего вызывается QwtPlot::replot().
Есть ли возможность оптимизировать отображения динамики изменения сигналов?


Название: Qwt real time
Отправлено: Alex Forth от Апрель 06, 2007, 10:55
ИМХО:
QWT под realtime не заточен :(. Для шустрой прорисовки куевой хучи данных удобнее рисовать, как осцилограф - т е отрисовывать только свежие данные и курву не сдвигать! Но тут прийдется Qwt проапгрейдить. Надо новый движок для шкалы, новый плоттер для согласования времени разных курв и управления шкалой времени. Ну и всего остально, чего я забыл, по мелочи.


Название: Qwt real time
Отправлено: bigirbis от Апрель 06, 2007, 11:59
На самом деле там как-то можно использовать хитрый механизм кэша: прорисовывать все в памяти, а потом  на плот картинку выкладывать. Но как его закрутить пока не осилил :(


Название: Qwt real time
Отправлено: Alex Forth от Апрель 06, 2007, 12:12
Ничего там в кеше хитрого нету. Класс  QwtPlotCanvas
Цитировать

enum QwtPlotCanvas::PaintAttribute
     
Paint attributes.

PaintCached
Paint double buffered and reuse the content of the pixmap buffer for some spontaneous repaints that happen when a plot gets unhidden, deiconified or changes the focus. Disabling the cache will improve the performance for incremental paints (using QwtPlotCurve::draw).

PaintPacked
Suppress system background repaints and paint it together with the canvas contents. Painting packed might avoid flickering for expensive repaints, when there is a notable gap between painting the background and the plot contents.

The default setting enables PaintCached and PaintPacked


В любом случае при сдвиге курвы у тебя возможны 2 варианта:
1) перерисовка всех курв на плотере
2) копирование пиксмапа кеша на плотер со сдвигом + рисование новых новых данных + сдвиг пиксмапа.

В принципе с твоими 10Гц и 4 курвы можно особо не заморачиваться. железо вытянет.


Название: Qwt real time
Отправлено: Ankor от Апрель 09, 2007, 12:34
Цитата: "bigirbis"

Есть ли возможность оптимизировать отображения динамики изменения сигналов?


Можно при старте делать:
  initCurve( lKey );
  setRawData( lKey, bufX, bufY, size );
А потом при динамическом изменении отрисовывать только то кол-во точек, которое изменилось через QwtPlot::drawCurve( lKey, startPoint, stopPoint ). Только размер bufX и bufY уже не должен динамически изменяться, надо на них сразу память выделять. Тогда при autoreplot перерисовывается не весь plot, а только ( stopPoint - startPoint ) точек.
( задача стояла похожая и в qwt 4.2 работает на ура ).


Название: Qwt real time
Отправлено: bigirbis от Апрель 09, 2007, 13:25
To Alex Forth
Спасибо.
А по второму варианту наметки есть?


Название: Qwt real time
Отправлено: Alex Forth от Апрель 11, 2007, 21:23
Про второй вариант я написал больше для порядка. Он конечно вполне работотспособен, но какой-то он половинчатый. С одной стороны он вроде как позволяет перерисовывать только нужные части курв, но копировать туда-сюда пиксмапы - єто не есть хорошо.
Если хочешь все-таки єто сделать, то смотри исходники qwt. Другого пути я, увы, не вижу  :cry: .Там тебе надо будет о т QwtPlot  пройтись к QwtPlotCanvas. насколько я помню, в последнем и будет пиксмап для кеширования. Тебе прийдется полностью разобраться в порядке отрисовки всего плоттера и, возможно, подхачить qwt.

Ankor
подсказал интересный вариант. ТОлько не стоит забывать про его недостатки;
 - когда данные полностью заполнят курву, нам прийдется кудато девать вновь прибывшие данные. Я не вижу другого варианта кроме как полностью очитстит bufY, переинитить на следующий временной интервал bufX и начать заполнять bufY с начала. При єтом старые данные на плотере будут стерты.
- прийдется танцевать с бубном возле автоматической настройки шкалы по Y. Єто связанно с тем что при каждом переполнении bufY масштаб Y шкалы будет дико прыгать.
- У меня при подобном подходе отрисовка по autoreplot не работает.