LINUX.ORG.RU

[QT/Xlib] как _быстро_ нарисовать на ваджете картинку из memory buffer ?


0

0

вобщем столкнулся с большой проблемой. 
Необходимо, чтобы большой буфер в памяти был очень быстро отрисован на QWidget'е.

Буфер представляет собой несжатое изображение в RGBA формате,
 ширина и высота известны.

Тестировал изображение 1200x1200: 

1) а) загоняю из буфера в QImage
    б) рисую с помощью QPainter::drawImage

результат:
    отрисовка идёт очень медленно (100 мс.)

2) а) загоняю из буфера в QImage
    б) конвертирую в QPixmap
    в) рисую с помощью QPainter::drawPixmap

результат:
    отрисовка идёт очень быстро, но сама конвертация QImage=>QPixmap ОЧЕНЬ медленная.

Как лучше это реализовать, чтобы отрисовка занимала, скажем,
 20-30 мс. ? Средствами QT либо XLib.

Больше спасибо.
anonymous

Ответ на: комментарий от Valeriy_Onuchin

эммм обсуждалось не совсем то.

Обсуждалось, в частности, что загрузка изображения проводится с диска (из JPEG'а). А у меня изображение _уже_ раскодировано и находится в памяти в виде unsigned char*, 32-битного массива.

Можно ли это сделать всё-таки, али нет ? :)

anonymous
()
Ответ на: комментарий от anonymous

вторая ссылка несовсем в тему, но зато первая - то, что надо.
посмотри внимательно.

Твои 2 варианта - это "по-большому" одно и тоже
QImage - client side, QPixmap - server side,

QPainter::drawImage делает QImage=>QPixmap, а потом BitBlt.

Тормоз здесь, очевидно, "QImage=>QPixmap", потому что
BitBlt можно hardware acceletate с помошью GL или Xshm.

Непонятно, зачем перерисовывать все 1200x1200 pixels?

ради интереса - ты не с antigrain.com там балуешся?






Valeriy_Onuchin ★★
()
Ответ на: комментарий от Valeriy_Onuchin

>>Тормоз здесь, очевидно, "QImage=>QPixmap", потому что
BitBlt можно hardware acceletate с помошью GL или Xshm.

Вот-вот. Я же и спрашиваю - как это можно нарисовать с помощью Xlib ? [В программированию под X не силён]

На QT походу надо забить - не умеет он пока этого :( А вот на Xlib ?

>>Непонятно, зачем перерисовывать все 1200x1200 pixels?

Это так называемый worst case - худший случай. На самом деле я из постоянного куска памяти (читай изображения) вычленяю кусочек, масштабирую его и рисую. Масштабирование идёт на MMX, т.е. очень быстро, а вот отрисовка - полный тормоз.

Про http://antigrain.com/ не слышал, но сейчас почитал. Один вопрос - а рисует она быстро ? Это всё что мне надо :)

Ещё раз спасибо.

anonymous
()

Я такую задачу решал на gdkpixbuf. никаких проблем маштабирование и отрисовка в реальном времени. Особенно если не юзаеш текст ибо рендеринг фонтов (через pango) ето тормоза.

главной задачей является правильное распределение нагрузки между Х-клиентом и Х-сервером

cvv ★★★★★
()
Ответ на: комментарий от cvv

> Про http://antigrain.com/ не слышал, но сейчас почитал. Один
>вопрос - а рисует она быстро ? Это всё что мне надо :)

она рисует в памяти. backend - может быть разным.
я задал этот вопрос, потому что упомянут RGBA format.
btw, действительно alpha-blending присутствует?

то о чем упоминает Sveta_F и XShm, XVideo extension - the same.
твоя задачка типична для screenserver - кода полно в сети.

вот еще интересная ссылка по-теме:
http://lists.trolltech.com/qt-interest/2004-03/msg00409.html

Valeriy_Onuchin ★★
()
Ответ на: комментарий от cvv

> Про http://antigrain.com/ не слышал, но сейчас почитал. Один
>вопрос - а рисует она быстро ? Это всё что мне надо :)

она рисует в памяти. backend - может быть разным.
я задал этот вопрос, потому что упомянут RGBA format.
btw, действительно alpha-blending присутствует?

то о чем упоминает Sveta_F и XShm, XVideo extension - the same.
твоя задачка типична для screenserver - кода полно в сети.

вот еще интересная ссылка по-теме:
http://lists.trolltech.com/qt-interest/2004-03/msg00409.html

Valeriy_Onuchin ★★
()
Ответ на: комментарий от cvv

cvv:

шняга в том, что gdk-pixbuf для масштабирования и композита использует MMX операции pixops - как и я :) Только рисоватьему удаётся быстро, а я пока сижу и думаю :)

anonymous
()
Ответ на: комментарий от Valeriy_Onuchin

>>http://lists.trolltech.com/qt-interest/2004-03/msg00409.html

уххх классная ссылка! Подредактировал этот пример под себя, выкинул ненужное - отрисовка летает! Теперь только проблема быстро скопировать память из своего буфера в shared memory - memcpy работает не очень :) Попробую замутить на MMX.

Большое спасибо.

anonymous
()
Ответ на: комментарий от Valeriy_Onuchin

Да, но смотри - в классе XshmImage создаётся шаред мемори определённого размера и возвращается указатель на неё, следовательно мне нужно в именно _писать_ данные, а не присвоить указателю другое значение, указывающее на другую память.

Т.е.:

После создания новой шары

m_pXShmSegmentInfo->shmaddr = m_pXImage->data = (char*)data = (int*)shmat(m_pXShmSegmentInfo->shmid, 0, 0);

в data нужно именно записывать данные, а делать data = another_memory_buffer нельзя. отсюда и

memcpy(data, another_memory_buffer, size_of_buffer);

anonymous
()
Ответ на: комментарий от Valeriy_Onuchin

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

Valeriy_Onuchin ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.