Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Torvald от Январь 09, 2013, 11:46



Название: Быстрый вывод пикселей
Отправлено: Torvald от Январь 09, 2013, 11:46
Подскажите самый быстрый способ вывести массив пикселей на виджет.
Сейчас я делаю так: пишу в буфер QImage (через QImage::bits()), потом рисую эжтот QImage через пейнтер на виджете. Получается довольно медленно.
Можно как то писать в буфер самого окна? Как то миновать этот промежуточный QImage.
Выслушаю любые способы ускорения этого процесса.


Название: Re: Быстрый вывод пикселей
Отправлено: Bepec от Январь 09, 2013, 12:08
Запихать их в QPainterPath и вывести его?

PS а по хорошему, озвучьте проблему полностью. Не часть (как выводить пиксели), а полностью (хочу выводить мону лизу в трехмерности на виджете).


Название: Re: Быстрый вывод пикселей
Отправлено: Igors от Январь 09, 2013, 12:26
Сейчас я делаю так: пишу в буфер QImage (через QImage::bits()), потом рисую эжтот QImage через пейнтер на виджете. Получается довольно медленно.
Напр сделали QImage::fill а затем его нарисовали - ну просто тест. Если для Вас это неприемлемо медленно -  тогда не знаю как ускорить. Если же тормоз при Вашем/конкретном заполнении QImage - показывайте как заполняете, а еще лучше выложите тестовый проект


Название: Re: Быстрый вывод пикселей
Отправлено: Torvald от Январь 09, 2013, 12:35
В зависимости от разрешения окна вызов функции drawImage занимает 20-60мс - очень долго.
Хочу реализовать софтварный рейкастинг, но столкнулся с проблемой медленного отображения буфера кадра.

Код:
Widget::Widget(QWidget *parent): QWidget(parent){
w = this->width();
h = this->height();
canvas = new QImage(w, h, QImage::Format_ARGB32);
pixels = (int*)canvas->bits();
connect(&timer, SIGNAL(timeout()), this, SLOT(tic()));
time.start();
timer.start(20);
}

Widget::~Widget(){
}

void Widget::tic(){
setWindowTitle(QString::number(time.elapsed()));
time.start();
update();
}

void Widget::paintEvent(QPaintEvent *){
QPainter p(this);
p.drawImage(0, 0, *canvas);
}
То есть пока не важно каким образом я заполняю пиксели - важно что рисуются они медленно


Название: Re: Быстрый вывод пикселей
Отправлено: GreatSnake от Январь 09, 2013, 12:46
Зачем нужен альфа-канал? На нём и проседает.


Название: Re: Быстрый вывод пикселей
Отправлено: Torvald от Январь 09, 2013, 12:53
да, да, альфа не нужен - оставил только ради выравнивания и удобства (int же). Без него рисует 15-45мс - все равно долго.
Я говорю о мгновенном флеше пикселей. Вроде как рисую в специальный буфер, вызываю функцию отображения и рррраз - все на экране менее чем за 1 мс)))
То есть имеется готовый массив - нужно отобразить.
Допускаю копирование пикселей в видоебуфер, то есть можно подключить OpenGL. Однако рендер все равно софтварный


Название: Re: Быстрый вывод пикселей
Отправлено: Igors от Январь 09, 2013, 13:34
да, да, альфа не нужен - оставил только ради выравнивания и удобства (int же).
Без альфы все равно 4 байта на пыксель  :)
А какие результаты если закомментировать вызов p.drawImage ?


Название: Re: Быстрый вывод пикселей
Отправлено: Torvald от Январь 09, 2013, 14:03
Ясное дело - 20мс ))
то есть только ожидание тика таймера. По сути - 0мс.
Функция драв как раз и выполняется долго.


Название: Re: Быстрый вывод пикселей
Отправлено: ecspertiza от Январь 09, 2013, 14:14
я думаю Igors хотел узнать в draw ли вообще проблема. Сделай замер ф-ции paintEvent по времени, что то вроде

Код:
QTime time;
time.start()

.....


qDebug() << time.elapsed();


Название: Re: Быстрый вывод пикселей
Отправлено: Dancing_on_water от Январь 09, 2013, 18:57
Код
C++ (Qt)
painter->beginNativePainting
 
// юзаем glDrawPixels из opengl
 
painter->endNativePainting

если нужно еще быстрее то уже надо выкидывать qt


Название: Re: Быстрый вывод пикселей
Отправлено: Torvald от Январь 10, 2013, 05:11
Смотрю в сторону реализации метода draw. Видимо средствами Qt мою задумку сделать нельзя - не для того Qt делали)
Так что либо OpenGL либо подсмотреть исходники Qt и сделать что нибудь самому. Всем спасибо


Название: Re: Быстрый вывод пикселей
Отправлено: Igors от Январь 10, 2013, 10:18
Смотрю в сторону реализации метода draw. Видимо средствами Qt мою задумку сделать нельзя - не для того Qt делали)
Если Вы собираетесь делать последовательность кадров (анимацию), то все равно Вам надо куда-то ее сливать (напр в AVI, MPEG и.т.п.). Средства для проигрывания получившегося мувика есть. Требовать от software чтобы оно считало в реальном времени, да еще и выводило - явно не то, если нужны fps, значит OpenGL