LINUX.ORG.RU

как ускорить отрисовку?

 ,


0

1

всем привет!

делаю проект где на 2D плоскость выводится результат обработки данных в РЕАЛЬНОМ масштабе времени(милисекунды). логическая организация и данные: - в простейшем случае это бинарная матрица 5000 на 5000, если в ячейке «1», то выводим пиксель, нет - ничего не рисуется; - поверх этой «карты» всякие линии, пиктограммы и пр служебная инфа. - все это дело выводится слоями и масштабируется

для GUI использую Qt 4.8 , а для визуализаии QGLWidget.

ну как в доках написано, я наследую класс. для рисования, т.к. я не сталкивался с openGl раньше и мне не нужна 3D графика, я решил использовать команды QPainter.

наследую: openGLwidget::openGLwidget(QWidget *parent) :QGLWidget(QGLFormat(QGL::SingleBuffer), parent) { //определяю нужные мне константы для рисования и тд. в настройки не лезу }

определяю paintGL(), для рисования используются примитивы пиксель, линия, окружность, текст и пиктограмма void openGLwidget::paintGL() { painter.begin(this); ... painter.drawLine(cPoint.rx(),cPoint.ry(),cPoint.rx()+x,cPoint.ry()+y); painter.drawPoint(cPoint.rx()+x,cPoint.ry()-y); ... и тп команды painter.end(); }

команда для рендеринга вызывается в таком вот цикле: while(!stop) { getdata(); // читаю данные processing(); // обрабатываю iko->updateGL(); //вывожу qApp->processEvents(); }

все работает, но как-то медленно - не быстрее, чем стандартный GDI. вопрос к профи: 1)подскажите пожалуйста как мне настроить opengl, чтобы добиться максимум быстродейтсвия (качество на втором плане) 2) если не использовать qpainter - будет ли быстрее? p.s. хочется обойтись без глубокого вникания в opengl, и по возможности пользоваться обертками, т.к. с точки зрения графики проект не требует выдающихся 3D наворотов


Лучше все же погрузится в OGL и использовать шейдеры.

В этом случае вы получите контроль над скоростью отображения. Скорость вывода графики в OGL зависит от количества данных, пересылаемых между GPU и CPU, и количество вертексов/пикселей, обрабатываемых во время рисования.

Если будете использовать OGL сможете точнее понять, где у вас затык (слишком много пересылки данных, слишком много вершин, слишком много пикселей) и уже крутить конкретно эту часть.

trex6 ★★★★★ ()

5000 на 5000 пикселей это очень много, это нереально много. Навскидку наяндексились только мониторы 2560x1600. С разрешением перебор в 6 раз, а значит, если сбавить разрешение в 6 раз, картинка хуже не станет, а отображаться будет в 6 раз быстрее.

i-rinat ★★★★★ ()
Ответ на: комментарий от trex6

да смысл то погружаться? неужели не завалялась какая-нибудь статья-примерчик. ведь мне то всего и надо несколько примитивов(точка, линия , текст) статей и настройка самого opengl,а мой случай-простой, никакой там 3d графики , теней и прочих наворотов.

vavav ()
Ответ на: комментарий от i-rinat

а это да,спасибо. там естественно не целиком отображаться будет, а в масштабе

vavav ()

т.к. я не сталкивался с openGl раньше и мне не нужна 3D графика, я решил использовать команды QPainter.

Ну и ССЗБ. Нечего тогда ругаться.

Неужто сложно было сделать нормальный openGL вывод? Там даже можно при помощи CUDA делать динамические вершины.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от vavav

а мой случай-простой

Для вашего случая и OGL простой.
1. Инициализация
2. Отправление данных на GPU
3. 2 простейших шейдера

Про разрешение уже подсказали.

trex6 ★★★★★ ()

Вы сейчас перерисовываете всё, или только ту часть, которая открыта у юзера на экране?

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

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

vavav ()

всем спасибо за ответы, я буду завтра утром!

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

Нет никаких двойных стандартов. Пользуйся тем, что проще и быстрей. Вот и все.

И да, даже если ты тупо будешь отрисовывать в openGL картинку из десятка-другого миллионов вершин, все равно без ARB-расширений не обойтись! А это — тот же блоб, между прочим…

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

Пользуйся тем, что пашет на как можно сильнее ограниченном кол-ве железа. Вот и все.

fixed

И да, даже если ты тупо будешь отрисовывать в openGL картинку из десятка-другого миллионов вершин, все равно без ARB-расширений не обойтись! А это — тот же блоб, между прочим…

Ну это ещё понятно, но куду то нахрена прикручивать?! Выпилим половину вендоров одним махом?! Иначе видать хреновые из нас фанбои?!

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

fixed

Тебе шашечки, или ехать?

куду то нахрена прикручивать?

Вчитался бы получше: я говорил о динамических вершинах. А это — только CUDA.

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

Тебе шашечки, или ехать?

Ехать. Куда - шашечки.

Вчитался бы получше: я говорил о динамических вершинах. А это — только CUDA.

А без этого никак?! ГЛАВНОЕ впихнуть зонд!

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

А без этого — с ограничениями. Т.е. по любому зонд!

Не путай определения. Стандартные технологии и зонд - диаметрально противоположные понятия.

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

Зонд — он и в Африке зонд. А зондом можно назвать как закрытые технологии, так и ограничения, связанные с кривым функционалом открытых.

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

Зонд — он и в Африке зонд.

Зонд - это то, что у вас фанбоев в анальном отверстии запихано.

А зондом можно назвать как закрытые технологии, так и ограничения, связанные с кривым функционалом открытых.

А стандарт - это то что должно работать везде, где предусмотрено. Не зависимо от вендора, открытости и прочих параметров стандарта.

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

Зонд - это то, что у вас фанбоев в анальном отверстии запихано.

У меня-то ничего не запихано. А вот у тебя, похоже, какой-то Столманозонд торчит.

стандарт - это то что должно работать везде, где предусмотрено

И насрать, что вместо пары секунд тебе год ждать придется окончания расчетов!

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

У меня-то ничего не запихано. А вот у тебя, похоже, какой-то Столманозонд торчит.

Я ничего не пропагандирую «технологий» привязанных к какому либо вендору. Не пропагандирую ни блобов ни СПО, использую только то что действительно стоит использовать.

И насрать, что вместо пары секунд тебе год ждать придется окончания расчетов!

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

ЗЫ я уже понял что ты неадекват, можешь меня в этом не убеждать.

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

И насрать, что вместо пары секунд тебе год ждать придется окончания расчетов!

наверное, с зондом в заднице время бежит незаметно

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

нормальный OGL с поставленной задачей прекрасно справится

С вычислением миллионов вершин в реальном времени?

ЗЫ я уже понял что ты неадекват, можешь меня в этом не убеждать

Та же хрень

Eddy_Em ☆☆☆☆☆ ()

в простейшем случае это бинарная матрица 5000 на 5000, если в ячейке «1», то выводим пиксель, нет - ничего не рисуется;

Лучше осилить opengl + fragment shader. Текстура / несколько текстур + по два треугольника на каждую текстуру. Если я правильно понял задачу, то это будет самая быстрая и простая реализация.

andreyu ★★★★★ ()
Последнее исправление: andreyu (всего исправлений: 1)

выводится результат обработки данных в РЕАЛЬНОМ масштабе времени(милисекунды).

А теперь погугли частоту обновления у ЭЛТ и латентность у LCD дисплеев, умница.

jessey ()

на 2D плоскость выводится результат обработки данных в РЕАЛЬНОМ масштабе времени(милисекунды).

Вам действительно нужно отображение результата с такой частотой? Если за этим будет следить человек, то такая частота ему явно не нужна. Обновление раз в секунду-пять будет более чем достаточно.
Если мониторить это дело будет софт, то зачем вообще нужна визуализация в рилтайме? Как только софтина отмониторила нужное состояние, его можно не спеша визуализировать.

andreyu ★★★★★ ()

QGLWidget

QPainter

а нет ли здесь извращений?

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

ну в принципе сообразил как мне надо. всем спасибо!

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