crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Попиксельное заполнение буфера
loh
  опции профиля:
сообщение 21.12.2011, 16:37
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 60
Регистрация: 11.5.2008
Пользователь №: 171

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет!

Задача такая, у меня есть датчик, типа линейного сканера, от него приходят данные представляющие собой двух байтные числа которые после некоторой математической обработки связанной с операциями сложения умножения деления вычитается превращаются либо в цвет точки. соответственно один пакет этих чисел это одна колонка пикселей на экране. Каждая новая колонка приходит на место старой, а вся картинка смещается на один пиксел в сторону. Проблема в том что частота прихода этих пакетов высокая - например 200 пакетов в секунду,

Так вот! как организовать буфер для сохранения исходных значений с датчика, буфер с обработанными значениями для вывода на экран, как синхронизировать вывод с приёмом, что бы картинка смешалась плавно, без рывков? И как сделать быструю обработку исходных значений для преобразования их в цвет уже в офлайн режиме, когда данные берутся не с датчика, а с буфера исходных данных? :о
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
BlueIceScream
  опции профиля:
сообщение 28.12.2011, 1:21
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 21.11.2011
Из: Республика Дагестан
Пользователь №: 3016

Спасибо сказали: 18 раз(а)




Репутация:   3  


Такое использование буфера будет на мой взгляд быстрее. Оно позволяет полность отказаться от использование QImage и от сдвигов.



Выделяете для буфера место в 2 раза больше нужного для представления картинки.

Заполнение состоит из 2 этапов.

Первый :

Начинаете заполнять буффер с конца. При этом каждая новая порция попадает вперед. То есть каждое новое изображение образуется из предыдущего простой сменой адреса начала данных в буффере. Нет необходимости делать сдвиги.

Для рисования используйте функцию:
void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data);

Она позволяет рисовать изображение заданного размера и типа, напрямую из памяти. Например:

glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, pointer);

То есть при поступлении новых данных(сканированной строки) значения pointer(адрес начала данных для рисования) просто изменяется на необходимое значение.
Никаких тяжелых сдвигов не нужно. А функция glDrawPixels использует аппартное ускорение для рисования.
Единственная важная вещь это как хранятся данные в буффере. Они должны быть в GL формате.

Например из QImage можно получить такой формат функцией:

QImage QGLWidget::convertToGLFormat ( const QImage & img ) [static].

Но так как вам следует полностью избавится от QImage, то прочитайте про формат и используйте напрямую в буфере.


Второй:

Этот этап начинается когда данные заполнили размер буфера выделенный для изображения (вернее его половину так как выделяется в 2 раза больше места в памяти чем нужно).
С этого момента данные начинают поступать в зарезервированную часть буфера. Рисование продолжается так же. Но запускает дополнительный поток который перекладывает поступившие данные на заднюю часть буфера. Когда уже буфер заполнится полностью, то первую половину будет дублировать вторая. Тогда переносим указатель на начало второй половины и работает как раньше. Как будто второй этап только начался. Как видите количество копирований максимально уменьшено.

Используйте функцию glDrawPixels в событии void QGLWidget::paintGL () [virtual protected]

Конечно синхронизация с остальной частью программы (в плане потоков) усложнится, но это позволит выжать максимум FPS.

Сообщение отредактировал BlueIceScream - 28.12.2011, 1:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- loh   Попиксельное заполнение буфера   21.12.2011, 16:37
- - ViGOur   Ну как я понимаю для это тебе нужно 3 потока и два...   24.12.2011, 10:32
- - loh   я так пробовал, там какая сложность была: чтобы вы...   24.12.2011, 12:34
- - ViGOur   Никаких циклов! Пришли данные для буфера №1, е...   24.12.2011, 13:22
- - loh   так я кажется пробовал тоже, и тогда это всё как-т...   24.12.2011, 17:12
- - ViGOur   А если у тебя поток данных вырастет ещё раз в 100,...   24.12.2011, 19:33
- - loh   ок, я так и делал, а мьютексы делать? а, да, и ещ...   24.12.2011, 21:13
- - ViGOur   Цитата(loh @ 24.12.2011, 22:13) ок, я так...   24.12.2011, 22:56
- - BlueIceScream   Для правильной реализации решения задачи производи...   24.12.2011, 23:04
- - loh   ну мне кажется qimage какое то лишнее звено которо...   24.12.2011, 23:42
- - BlueIceScream   QImage предоставляет аппаратно-независимый подход ...   25.12.2011, 1:52
|- - loh   Цитата(BlueIceScream @ 25.12.2011, 1:52) ...   26.12.2011, 16:11
|- - wiz29   Цитата(loh @ 26.12.2011, 17:11) Я сейчас ...   26.12.2011, 16:20
- - loh   блин как спросить то чтобы понятно было вот й qi...   26.12.2011, 22:03
- - BlueIceScream   Скорость работы функций QPainter напрямую зависит ...   26.12.2011, 22:31
- - loh   тоесть например QImage img; QGLPixelBuffer* pb = ...   26.12.2011, 23:30
- - BlueIceScream   Если вы используете QImage или QGLBuffer, то зачем...   27.12.2011, 0:38
- - loh   qpainter ом мне в опенгл разбираться долго чето н...   27.12.2011, 1:30
- - BlueIceScream   QPainter при выводе обязательно переводит QImage в...   27.12.2011, 2:33
- - loh   А можно qglwidget & qgraphicsscene объединить,...   27.12.2011, 6:48
- - wiz29   как я понял, тебе нужно выводить нечто в виде осци...   27.12.2011, 8:33
- - Sokoloff   Цитата(loh @ 21.12.2011, 17:37) Проблема ...   27.12.2011, 9:23
- - loh   У меня с тормозами даже кадров 5-6 в секунду было,...   27.12.2011, 10:24
|- - wiz29   Цитата(loh @ 27.12.2011, 11:24) Типа осци...   27.12.2011, 10:39
- - loh   Вооо класс! Я знал что должна быть какая то шт...   27.12.2011, 13:35
|- - wiz29   Цитата(loh @ 27.12.2011, 14:35) а как поп...   27.12.2011, 13:59
- - loh   А не знаешь, аппаратный скрол только в пиксмапе? В...   27.12.2011, 14:16
- - wiz29   qgraphicsitem может кешироваться подсистемой qgrap...   27.12.2011, 14:17
- - BlueIceScream   ЦитатаТипа осцилограммы нормально выводится, мне н...   27.12.2011, 18:19
|- - loh   Цитата(BlueIceScream @ 27.12.2011, 19:19)...   27.12.2011, 23:07
- - BlueIceScream   Такое использование буфера будет на мой взгляд быс...   28.12.2011, 1:21
- - loh   А как сделать зуммирование при рисовании картинки ...   28.12.2011, 14:14
- - BlueIceScream   Можете попробовать: void glPixelZoom( GLfloat x...   28.12.2011, 21:22
- - loh   Пока разбираюсь, полет нормальный, такой вопрос во...   29.12.2011, 10:47
- - BlueIceScream   Эта ветка по Qt. Если есть вопросы по работе функц...   29.12.2011, 16:09
|- - whatevillurks   Зачот получается вы даете не профессиональные сове...   29.12.2011, 16:13
- - BlueIceScream   Конечно же нет. Я не профессионал. Я вообще не про...   29.12.2011, 16:24
- - Abesh   У меня по теме есть вопрос: Проблема вот в чем, ес...   17.1.2012, 17:11


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.11.2024, 12:00