Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: boolean от Октябрь 01, 2012, 13:52



Название: знатоки, как поступить?!
Отправлено: boolean от Октябрь 01, 2012, 13:52
всем привет. вообщем делаю прогу с вычислениями и отрисовкой в реальном времени, так что к ПО предъявляются повышенные требования к быстродействию и надежности, и еще нужна кроссплатформенность : линукс и win xp.
решил сделать интерфейс и визуализацию на qt (до этого только на билдере работал; 3D графика не нужна). теперь конкретнее:
1) какой компонент и методы использовать, чтобы получить максимальное быстродействие отрисовки и возможности аппаратного ускорения ( opengl)
2) как получить отрисовку без мерцания? (в билдере рисовал в промежуточный буфер и выводил хором все слои)
2) есть разные типы данных, которые обновляются через разные интервалы времени (от милисекунд до часов), но отображаться они должны постоянно и ПО СЛОЯМ. в билдере эту задачу решил использованием TBitmap. есть ли что-нибудь подобное здесь?
3) приложение многопоточное, и как обстоит в qt с рисованием из потока? тоже исключительно из главного?
4) приветствуются ссылки на статьи и примеры
повторюсь нужно максимум быстродействия


Название: Re: знатоки, как поступить?!
Отправлено: mutineer от Октябрь 01, 2012, 14:05
1) QGLWidget
3) Есть QBitmap, наверно он подойдет (хз что ты делал с TBitmap)
4) да, тоже только из главного


Название: Re: знатоки, как поступить?!
Отправлено: Igors от Октябрь 01, 2012, 14:09
А если не знаток то лучше не отвечать, что ли?  :)

- TBitmap = QImage
- да, тоже только из главного

По поводу злободневного ускорения: буквально неск дней назад я себе сделал FBO и очень этим доволен, руки развязаны, ни от каких "компонентов" я не завишу


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 02, 2012, 05:25
По поводу злободневного ускорения: буквально неск дней назад я себе сделал FBO и очень этим доволен, руки развязаны, ни от каких "компонентов" я не завишу

всем спасибо за ответы! а что такое FBO если объяснить"на пальцах" ?
и как с выводом текста в этом виджете? мне требуется выводить различную служебную информацию.


Название: Re: знатоки, как поступить?!
Отправлено: Igors от Октябрь 02, 2012, 10:09
а что такое FBO если объяснить"на пальцах" ?
OpenGL рендерит в буфер (offscreen), который читаете и комбинируете как хотите (по слоям или как)


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 02, 2012, 10:18
аа, спасибо


Название: Re: знатоки, как поступить?!
Отправлено: xokc от Октябрь 02, 2012, 10:37
К несчастью не все драйвера OpenGL поддерживают off-screen rendering.


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 02, 2012, 13:18
К несчастью не все драйвера OpenGL поддерживают off-screen rendering.

и как это узнать?


Название: Re: знатоки, как поступить?!
Отправлено: Igors от Октябрь 02, 2012, 14:28
Проверить extension:  GL_ARB_framebuffer_object


Название: Re: знатоки, как поступить?!
Отправлено: navrocky от Октябрь 02, 2012, 14:34
К сведению, OpenGL не всегда ускоряет прорисовку. Хорошо ускоряется рисование деформированных картинок (масштабирование, поворот), заливка цветом. Плохо ускоряется вывод текста, рисование линий, кривых, точек в сравнении с software render.


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 03, 2012, 06:05
К сведению, OpenGL не всегда ускоряет прорисовку. Хорошо ускоряется рисование деформированных картинок (масштабирование, поворот), заливка цветом. Плохо ускоряется вывод текста, рисование линий, кривых, точек в сравнении с software render.

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


Название: Re: знатоки, как поступить?!
Отправлено: navrocky от Октябрь 03, 2012, 06:45
Вопрос как раз в том, что рисуется из матрицы пикселами? И что за «и т.д.»?


Название: Re: знатоки, как поступить?!
Отправлено: ssoft от Октябрь 03, 2012, 06:51
К сведению, OpenGL не всегда ускоряет прорисовку. Хорошо ускоряется рисование деформированных картинок (масштабирование, поворот), заливка цветом. Плохо ускоряется вывод текста, рисование линий, кривых, точек в сравнении с software render.

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

Пара секретов.
- желательно отрисовывать сцену как можно за меньшее количество раз (не останавливая конвейер GL).
- данные хранить на видеокарте.
- текст лучше отображать с использованием текстур (сначала рендеринг символов в текстуру, затем отображаем текст, используя текстурные символы).
- текстуры располагать формировать в виде атласа текстур (когда много мелких текстур, располагаются на одной большой).
- использовать шейдеры.


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 03, 2012, 07:26
Вопрос как раз в том, что рисуется из матрицы пикселами? И что за «и т.д.»?
ну как в любом растровом изображении: матрица хранит информацию о распределении по цветам, яркости и тп. так и у меня, только данные берутся из показаний датчиков. ну соотв доп операции: масштаб, сдвиг



Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 03, 2012, 07:28
Отлично все ускоряется. Мне пришлось написать свой движок, т.к. Qt и рассмотренные мной другие библиотеки не справляются ни в каком режиме работы.
Множество (тысячи) интерактивных часто изменяющихся динамических элементов, состоящие из невыпуклых полигонов, линий, точек и текста.

Пара секретов.
- желательно отрисовывать сцену как можно за меньшее количество раз (не останавливая конвейер GL).
- данные хранить на видеокарте.
- текст лучше отображать с использованием текстур (сначала рендеринг символов в текстуру, затем отображаем текст, используя текстурные символы).
- текстуры располагать формировать в виде атласа текстур (когда много мелких текстур, располагаются на одной большой).
- использовать шейдеры.
случайно не программа УВД?
"Мне пришлось написать свой движок" - это как? обернул классами opengl?
за секреты большое спасибо


Название: Re: знатоки, как поступить?!
Отправлено: navrocky от Октябрь 03, 2012, 08:32
Ну если одна ячейка матрицы отображается одной как-то раскрашенной точкой, то можно и с помощью opengl. Нарисуй одну большую текстуру и ее отображай. Хотя я не могу сказать насколько быстро эта текстура будет обновляться...

Мне кажется единственное преимущество opengl здесь будет в возможности быстро масштабировать и вращать картинку.
Если это не нужно, то я бы рисовал с помощью QImage.



Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 03, 2012, 08:44
Ну если одна ячейка матрицы отображается одной как-то раскрашенной точкой, то можно и с помощью opengl. Нарисуй одну большую текстуру и ее отображай. Хотя я не могу сказать насколько быстро эта текстура будет обновляться...

Мне кажется единственное преимущество opengl здесь будет в возможности быстро масштабировать и вращать картинку.
Если это не нужно, то я бы рисовал с помощью QImage.

да,попробую. рассчет еще такой, чтобы максимально разгрузить процессор, поручив граф визуализацию видеокарте. или я не правильно понимаю opengl ?


Название: Re: знатоки, как поступить?!
Отправлено: Igors от Октябрь 03, 2012, 10:18
да,попробую. рассчет еще такой, чтобы максимально разгрузить процессор, поручив граф визуализацию видеокарте. или я не правильно понимаю opengl ?
Не то чтобы "неправильно", но довольно "упрощенно" :) Если нет 3D объектов, то использование OpenGL необязательно. Может быть лучше сначала определиться с базовой техникой. Напр часто требуется вывод текста. Это можно сделать неск способами

- средствами Qt
- вызовами нативных ф-ций OC
- текстурами OpenGL

Накидать простой примерчик и замерить. Примечание: не надо думать что первые  2 - почти одно и то же.
Следующая позиция - напр анти-алиас. Подход тот же. А потом уже делать выводы/обобщения


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 03, 2012, 10:33
да,попробую. рассчет еще такой, чтобы максимально разгрузить процессор, поручив граф визуализацию видеокарте. или я не правильно понимаю opengl ?
Не то чтобы "неправильно", но довольно "упрощенно" :) Если нет 3D объектов, то использование OpenGL необязательно. Может быть лучше сначала определиться с базовой техникой. Напр часто требуется вывод текста. Это можно сделать неск способами

- средствами Qt
- вызовами нативных ф-ций OC
- текстурами OpenGL

Накидать простой примерчик и замерить. Примечание: не надо думать что первые  2 - почти одно и то же.
Следующая позиция - напр анти-алиас. Подход тот же. А потом уже делать выводы/обобщения
спасибо


Название: Re: знатоки, как поступить?!
Отправлено: ssoft от Октябрь 03, 2012, 13:02
случайно не программа УВД?
"Мне пришлось написать свой движок" - это как? обернул классами opengl?
за секреты большое спасибо

Он самый - УВД.
Написал свои классы, и использовал QGraphicsItem, как менеджер собственных графических объектов.
Также полностью обернул классами OpenGL.
Получил возможность одновременного отображения Qt элементов и своих.
Пришлось повозится с их интерактивностью, зато теперь все "летает".
Деталями пока поделится не могу - коммерческий проект.


Название: Re: знатоки, как поступить?!
Отправлено: boolean от Октябрь 03, 2012, 13:43
Также полностью обернул классами OpenGL.
так модуль QOpenGL это и есть же та самая обертка классами. если да, то чем стандартные средства не подошли?
неужели в разы проигрывает в скорости?
кстати в каком городе работа?


Название: Re: знатоки, как поступить?!
Отправлено: ssoft от Октябрь 03, 2012, 14:16
Также полностью обернул классами OpenGL.
так модуль QOpenGL это и есть же та самая обертка классами. если да, то чем стандартные средства не подошли?
неужели в разы проигрывает в скорости?
кстати в каком городе работа?

Нет в скорости не проигрывает, просто когда писался движок, возможности Qt в OpenGL были скупы.
Да и работать нужно напрямую с памятью видеокарты. Хитрости всякие учитывать, которых нет в Qt.

Работа в Москве http://lemz.ru/ (http://lemz.ru/)