Russian Qt Forum
Ноябрь 23, 2024, 16:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Быстрый вывод пикселей  (Прочитано 6618 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« : Январь 09, 2013, 11:46 »

Подскажите самый быстрый способ вывести массив пикселей на виджет.
Сейчас я делаю так: пишу в буфер QImage (через QImage::bits()), потом рисую эжтот QImage через пейнтер на виджете. Получается довольно медленно.
Можно как то писать в буфер самого окна? Как то миновать этот промежуточный QImage.
Выслушаю любые способы ускорения этого процесса.
Записан
Bepec
Гость
« Ответ #1 : Январь 09, 2013, 12:08 »

Запихать их в QPainterPath и вывести его?

PS а по хорошему, озвучьте проблему полностью. Не часть (как выводить пиксели), а полностью (хочу выводить мону лизу в трехмерности на виджете).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 09, 2013, 12:26 »

Сейчас я делаю так: пишу в буфер QImage (через QImage::bits()), потом рисую эжтот QImage через пейнтер на виджете. Получается довольно медленно.
Напр сделали QImage::fill а затем его нарисовали - ну просто тест. Если для Вас это неприемлемо медленно -  тогда не знаю как ускорить. Если же тормоз при Вашем/конкретном заполнении QImage - показывайте как заполняете, а еще лучше выложите тестовый проект
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #3 : Январь 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);
}
То есть пока не важно каким образом я заполняю пиксели - важно что рисуются они медленно
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Январь 09, 2013, 12:46 »

Зачем нужен альфа-канал? На нём и проседает.
Записан

Qt 5.11/4.8.7 (X11/Win)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #5 : Январь 09, 2013, 12:53 »

да, да, альфа не нужен - оставил только ради выравнивания и удобства (int же). Без него рисует 15-45мс - все равно долго.
Я говорю о мгновенном флеше пикселей. Вроде как рисую в специальный буфер, вызываю функцию отображения и рррраз - все на экране менее чем за 1 мс)))
То есть имеется готовый массив - нужно отобразить.
Допускаю копирование пикселей в видоебуфер, то есть можно подключить OpenGL. Однако рендер все равно софтварный
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 09, 2013, 13:34 »

да, да, альфа не нужен - оставил только ради выравнивания и удобства (int же).
Без альфы все равно 4 байта на пыксель  Улыбающийся
А какие результаты если закомментировать вызов p.drawImage ?
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #7 : Январь 09, 2013, 14:03 »

Ясное дело - 20мс ))
то есть только ожидание тика таймера. По сути - 0мс.
Функция драв как раз и выполняется долго.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Январь 09, 2013, 14:14 »

я думаю Igors хотел узнать в draw ли вообще проблема. Сделай замер ф-ции paintEvent по времени, что то вроде

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

.....


qDebug() << time.elapsed();
Записан
Dancing_on_water
Гость
« Ответ #9 : Январь 09, 2013, 18:57 »

Код
C++ (Qt)
painter->beginNativePainting
 
// юзаем glDrawPixels из opengl
 
painter->endNativePainting

если нужно еще быстрее то уже надо выкидывать qt
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #10 : Январь 10, 2013, 05:11 »

Смотрю в сторону реализации метода draw. Видимо средствами Qt мою задумку сделать нельзя - не для того Qt делали)
Так что либо OpenGL либо подсмотреть исходники Qt и сделать что нибудь самому. Всем спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Январь 10, 2013, 10:18 »

Смотрю в сторону реализации метода draw. Видимо средствами Qt мою задумку сделать нельзя - не для того Qt делали)
Если Вы собираетесь делать последовательность кадров (анимацию), то все равно Вам надо куда-то ее сливать (напр в AVI, MPEG и.т.п.). Средства для проигрывания получившегося мувика есть. Требовать от software чтобы оно считало в реальном времени, да еще и выводило - явно не то, если нужны fps, значит OpenGL
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 23.