Попиксельное заполнение буфера |
Здравствуйте, гость ( Вход | Регистрация )
Попиксельное заполнение буфера |
BlueIceScream |
25.12.2011, 1:52
Сообщение
#11
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
QImage предоставляет аппаратно-независимый подход к изображению. Особенно сильно это будет проявляться когда графическая система будет отличаться от привычных. Например через QImage можно работать с directFB.
QPainter используется для рисования. Он должен на чем-то рисовать. Другой возможности рисовать не существует. Обязательно QPainter требует QPaintDevice. Вот устройства для рисования: QCustomRasterPaintDevice, QGLFramebufferObject, QGLPixelBuffer, QImage, QPicture, QPixmap, QPrinter, QSvgGenerator, QWidget. Выбирай и рисуй. Или создавай свой потомок QPaintDevice и определяй собственный QPaintEngine. Если так важна производительность и не важна аппаратная зависимость, то QGLPixelBuffer лучший выбор. Он использует полное аппаратное ускорение. Рисует в памяти. Затем можешь рендерить прямо в QImage. Qt содержит пример использования QGLPixelBuffer - Pixel Buffers Example Сообщение отредактировал BlueIceScream - 25.12.2011, 13:28 |
|
|
loh |
26.12.2011, 16:11
Сообщение
#12
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
QImage предоставляет аппаратно-независимый подход к изображению. Особенно сильно это будет проявляться когда графическая система будет отличаться от привычных. Например через QImage можно работать с directFB. QPainter используется для рисования. Он должен на чем-то рисовать. Другой возможности рисовать не существует. Обязательно QPainter требует QPaintDevice. Вот устройства для рисования: QCustomRasterPaintDevice, QGLFramebufferObject, QGLPixelBuffer, QImage, QPicture, QPixmap, QPrinter, QSvgGenerator, QWidget. Выбирай и рисуй. Или создавай свой потомок QPaintDevice и определяй собственный QPaintEngine. Если так важна производительность и не важна аппаратная зависимость, то QGLPixelBuffer лучший выбор. Он использует полное аппаратное ускорение. Рисует в памяти. Затем можешь рендерить прямо в QImage. Qt содержит пример использования QGLPixelBuffer - Pixel Buffers Example Что то я посмотрел этот pixel buffer и не понял как он поможет мне ( Я сейчас как делаю, в событии рисования просто рисую qimage, а в отдельном потоке просто заполняю попиксельно массив этой картинки, bits(), это быстрее чем встроенной функцией доступа к пикселям получается, но может быть можно как то qpainter соблазнить на рисование этого массива напрямую, тоесть не создавать qimage, а создать массив, выделить для него память и напрямую обрисовать в qpainter, |
|
|
wiz29 |
26.12.2011, 16:20
Сообщение
#13
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Я сейчас как делаю, в событии рисования просто рисую qimage, а в отдельном потоке просто заполняю попиксельно массив этой картинки, bits(), это быстрее чем встроенной функцией доступа к пикселям получается, но может быть можно как то qpainter соблазнить на рисование этого массива напрямую, тоесть не создавать qimage, а создать массив, выделить для него память и напрямую обрисовать в qpainter, Видимо у вас нет понимания, что такое QPainter и что такое QPaintDevice. QPainter рисует на QPaintDevice. без устройства QPainter не имеет смысла. QPainter- это тулза по средством которой вы можете рисовать на устройстве вывода. Можно использовать неформатированный массив данных для инициализации QImage, но следует понимать, что в таком случае вы хотите получить на выходе. |
|
|
loh |
26.12.2011, 22:03
Сообщение
#14
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
блин как спросить то чтобы понятно было
вот й qimage есть bits() существует ли такой же bits() или какой то аналогичный массив для всего qwidget например? тоесть рисовать виджет напрямую изменяя значения его пикселей? :О qpainter::drawPoint оччень медленно рисует я от него давно отказался полагаю drawimage тоже не быстрая функция.. кстати наапример в qpicture не могу понять setData как пользоваться и вообще qpicture может как то тут помочь?))) |
|
|
BlueIceScream |
26.12.2011, 22:31
Сообщение
#15
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Скорость работы функций QPainter напрямую зависит от QPaintEngine и QPaintDevice.
Одни и те же функции QPainter будут работать по разному для различных QPaintDevice. Это потому что QPainter использует для рисования QPaintEngine определенный для выбранного QPaintDevice. Используйте рисование с помощью QPainter в QGLPixelBuffer. Затем рендерите куда вам угодно. Для максимальной скорости в GL образный контекст. Запомните QPainter использует для реализации функций рисования QPaintEngine, который рисует на QPaintDevice. Скорость работы функций QPainter зависит от QPaintDevice (потому что задействуется связанный с ним QPaintEngine). Поэтому на QWidget рисовать очень накладно. Выберите необходимый QPaintDevice. А потом рисуйте как угодно на нем используя любые функции QPainter. |
|
|
loh |
26.12.2011, 23:30
Сообщение
#16
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
тоесть например
QImage img; QGLPixelBuffer* pb = new QGLPixelBuffer(1000,1000); QPainter p(pb); for (int i = 0; i<1000; i ++) for (int j = 0; j<1000; j ++) { p->setPen(buffer[i+1000*j]); p->drawPoint(i,j); } img = pb.toImage(); будет быстрее чем QImage img; for (int i = 0; i<1000; i ++) for (int j = 0; j<1000; j ++) { ((QRgb*)img.bits())[i+1000j] = buffer[i+1000*j]; } ? |
|
|
BlueIceScream |
27.12.2011, 0:38
Сообщение
#17
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Если вы используете QImage или QGLBuffer, то зачем вам вообще QPainter.
Выводите данные как в примере Pixel Buffers Example. Или используйте QImage напрямую с QGLWidget без QPainter вообще. Устанавливайте данные в QImage, переводите GLFormat. Затем рисуйте с помощью glDrawPixels. Это будет намного быстрее. Вы сейчас как выводите QImage на экран? Сообщение отредактировал BlueIceScream - 27.12.2011, 1:10 |
|
|
loh |
27.12.2011, 1:30
Сообщение
#18
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
qpainter ом
мне в опенгл разбираться долго чето ничего там не понимаю |
|
|
BlueIceScream |
27.12.2011, 2:33
Сообщение
#19
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
QPainter при выводе обязательно переводит QImage в QPixmap. Это очень расточительно. Используйте вариант с QGLWidget и функцией glDrawPixels. Это легко и эффективно. Хотя при работе c QGLWidget , QPainter уже будет использовать рендерный движок OpenGL.
|
|
|
loh |
27.12.2011, 6:48
Сообщение
#20
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
А можно qglwidget & qgraphicsscene объединить, ну или совместить?
|
|
|
Текстовая версия | Сейчас: 30.11.2024, 12:10 |