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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qwt real time  (Прочитано 9152 раз)
bigirbis
Гость
« : Апрель 05, 2007, 16:08 »

Как при скроллировании любой из осей не использовать replot?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Апрель 05, 2007, 16:17 »

поподробне
там есть у plot свойтство типа autoreplot

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

а вам что хочется?
Записан
bigirbis
Гость
« Ответ #2 : Апрель 05, 2007, 18:02 »

Исходные данные:
регистрация сигналов через usb порт
Скорость обновления - 10 Гц.
Количество одновременно отображаемых точек на плоте - до 500 на одну кривую.
Количество кривых - до 4.
Текущая реализация:
на каждую кривую объявлены динамические массивы, связанные с кривыми с помощью QwtPlot::setRawData(..).
При приходе новой партии массивы сдвигаются влево с помощью memcpy на количество пришедших данных.
В конец массива дописываются пришедшие данные. Высталяются границы QwtPlot::setAxisScale(QwtPlot::xBottom,
левая граница массива, правая граница массива). После чего вызывается QwtPlot::replot().
Есть ли возможность оптимизировать отображения динамики изменения сигналов?
Записан
Alex Forth
Гость
« Ответ #3 : Апрель 06, 2007, 10:55 »

ИМХО:
QWT под realtime не заточен Грустный. Для шустрой прорисовки куевой хучи данных удобнее рисовать, как осцилограф - т е отрисовывать только свежие данные и курву не сдвигать! Но тут прийдется Qwt проапгрейдить. Надо новый движок для шкалы, новый плоттер для согласования времени разных курв и управления шкалой времени. Ну и всего остально, чего я забыл, по мелочи.
Записан
bigirbis
Гость
« Ответ #4 : Апрель 06, 2007, 11:59 »

На самом деле там как-то можно использовать хитрый механизм кэша: прорисовывать все в памяти, а потом  на плот картинку выкладывать. Но как его закрутить пока не осилил Грустный
Записан
Alex Forth
Гость
« Ответ #5 : Апрель 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 курвы можно особо не заморачиваться. железо вытянет.
Записан
Ankor
Гость
« Ответ #6 : Апрель 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 работает на ура ).
Записан
bigirbis
Гость
« Ответ #7 : Апрель 09, 2007, 13:25 »

To Alex Forth
Спасибо.
А по второму варианту наметки есть?
Записан
Alex Forth
Гость
« Ответ #8 : Апрель 11, 2007, 21:23 »

Про второй вариант я написал больше для порядка. Он конечно вполне работотспособен, но какой-то он половинчатый. С одной стороны он вроде как позволяет перерисовывать только нужные части курв, но копировать туда-сюда пиксмапы - єто не есть хорошо.
Если хочешь все-таки єто сделать, то смотри исходники qwt. Другого пути я, увы, не вижу  :cry: .Там тебе надо будет о т QwtPlot  пройтись к QwtPlotCanvas. насколько я помню, в последнем и будет пиксмап для кеширования. Тебе прийдется полностью разобраться в порядке отрисовки всего плоттера и, возможно, подхачить qwt.

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


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