crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Попиксельное заполнение буфера
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  


Цитата(BlueIceScream @ 25.12.2011, 1:52) *
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  


Цитата(loh @ 26.12.2011, 17:11) *
Я сейчас как делаю, в событии рисования просто рисую 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];
}


? :o:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 объединить, ну или совместить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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