Название: 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 не работает. |