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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Включение аппаратного рендеринга OpenGL  (Прочитано 21202 раз)
developer-nsk
Гость
« : Октябрь 16, 2009, 17:19 »

Здравствуйте, уважаемые господа программисты! Суть проблемы - есть сцена-карта, которая содержит массу QGraphicsItem'ов, в том числе большие текстуры-картинки, которые отображаются с флагом QPainter::SmoothPixmapTransform (сглаженные, иначе говоря). Отображается данная сцена посредством QGraphicsView, с его же помощью, соответственно, происходит перемещение по карте, зум и поворот карты. Проблема заключается в тормозах, которые проявляются при осуществлении этих операций (перемещение, зум, поворот), причём тормоза эти - исключительно из-за изображений (фотографий местности). Посему появилась мысль, включить аппаратное ускорение этого дела посредством OpenGL... Каким образом лучше всего это осуществить? Заранее премного благодарен за помощь.
Записан
SABROG
Гость
« Ответ #1 : Октябрь 16, 2009, 17:48 »

Посему появилась мысль, включить аппаратное ускорение этого дела посредством OpenGL...

На сколько я знаю аппаратное ускорение включено изначально везде где только можно, если это поддерживает видео-карта.
Особенно это хорошо видно на linux'е, когда изначально стоят дефолтные дрова.
Записан
developer-nsk
Гость
« Ответ #2 : Октябрь 16, 2009, 17:56 »

На сколько я знаю аппаратное ускорение включено изначально везде где только можно, если это поддерживает видео-карта.
Особенно это хорошо видно на linux'е, когда изначально стоят дефолтные дрова.

Не совсем... Как я понимаю, по умолчанию вся обработка подобных вещей идёт без использования аппаратного ускорения. Взять хотя бы демки Affine Transformations или Gradients. При включении флажка OpenGL, эти демки начинают многократно шустрее шевелиться, особенно в полноэкранном режиме. Я пробовал разбирать код классов Arthur Widget, с помощью которых написаны эти демки, но повторить включение аппаратного ускорения в моём приложении как-то не получилось...
Записан
BRE
Гость
« Ответ #3 : Октябрь 16, 2009, 18:03 »

Не совсем... Как я понимаю, по умолчанию вся обработка подобных вещей идёт без использования аппаратного ускорения. Взять хотя бы демки Affine Transformations или Gradients. При включении флажка OpenGL, эти демки начинают многократно шустрее шевелиться, особенно в полноэкранном режиме. Я пробовал разбирать код классов Arthur Widget, с помощью которых написаны эти демки, но повторить включение аппаратного ускорения в моём приложении как-то не получилось...
Из демки chip:
Код
C++ (Qt)
void View::toggleOpenGL()
{                        
#ifndef QT_NO_OPENGL    
   graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
#endif                                                                                                                
}                                                                                                                    
 
Записан
developer-nsk
Гость
« Ответ #4 : Октябрь 16, 2009, 18:11 »


Из демки chip:
Код
C++ (Qt)
void View::toggleOpenGL()
{                        
#ifndef QT_NO_OPENGL    
   graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
#endif                                                                                                                
}                                                                                                                    
 

Спасибо за вариант, но я его уже тоже попробовал - бесполезно. Более того, в демке chip лично у меня на компе при выключенном флаге OpenGL всё работает ещё быстрее, чем при включенном. И я так подозреваю, что это не совсем то, т.к. уж очень сильно видна разница между включенном OpenGL в демках Gradients и Chips...
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #5 : Октябрь 16, 2009, 18:31 »

То?
Записан
developer-nsk
Гость
« Ответ #6 : Октябрь 16, 2009, 18:43 »


Попробовал... Честно говоря, не то :-) Но всё равно спасибо!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 16, 2009, 18:49 »

Я лично не очень понимаю что должен ускорять OGL если нет полигонов, OGL примитивов, OGL текстур и.т.п.?
Хотя я в hardware не силен, все может быть Улыбающийся
Записан
developer-nsk
Гость
« Ответ #8 : Октябрь 16, 2009, 19:40 »

Я лично не очень понимаю что должен ускорять OGL если нет полигонов, OGL примитивов, OGL текстур и.т.п.?
Хотя я в hardware не силен, все может быть Улыбающийся

Хммм... Я понимаю, что Вы имеете ввиду. И, честно говоря, не до конца понимаю механизм того, как это работает в Qt для двумерной графики, но ведь как-то же это реализовано в демках Affine Transformations и Gradients :-)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 16, 2009, 19:59 »

Хммм... Я понимаю, что Вы имеете ввиду. И, честно говоря, не до конца понимаю механизм того, как это работает в Qt для двумерной графики, но ведь как-то же это реализовано в демках Affine Transformations и Gradients :-)
В этих демках есть полигоны которые OGL действительно ускорит. Если Вы сделаете свои GraphicsItem(s) из чего-то типа QPolygonF - Вы тоже можете рассчитывать на ускорение. А иначе - я не знаю как.
Записан
SABROG
Гость
« Ответ #10 : Октябрь 16, 2009, 20:16 »

Если мне память не изменяет, то сама реализация OpenGL обычно идет вместе с драйверами видео-карты. Поэтому дрова используют не какой-то общий механизм ускорения, а аппаратные фичи той карты под которую был реализован этот OpenGL. Плохо то, что стандарт OpenGL идет впереди реализаций, в общем также как и в C++. Но все-таки общий механизм ускорения 2d включается при установке драйверов, а дополнительное ускорение, видимо, можно получить только при использовании библиотек типа DirectX и OpenGL.
Записан
_OLEGator_
Гость
« Ответ #11 : Октябрь 16, 2009, 22:33 »

Можно попробовать отрисовывать на чистом OpenGL, 3D сцену, на которой будет плоскость с набором картинок.
Потому что отрисовка QPainter'ом на QGLWidget'e никакого ускорения значительного не даст...

Либо сделать дискретный мастаб, когда для каждого масштаба будут подобраны картинки оптимального размера, аля Гугл мап
« Последнее редактирование: Октябрь 16, 2009, 22:35 от _OLEGator_ » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #12 : Октябрь 17, 2009, 00:43 »

В выпуске QtQuarterly --- Issue 26 · Q2 2008 --- Accelerate your Widgets with OpenGL · Example Code

Думаю вы это ищите - там как работа с QGraphicsView.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #13 : Октябрь 21, 2009, 17:25 »

Насколько я знаю, ускорение работает далеко не на всех видеокартах. И это правда, что на одних видюхах будет быстрее с ускорением, с другим - без. Я про это в Нокию писал еще летом. Это имхо баг.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Октябрь 21, 2009, 19:03 »

Можно попробовать отрисовывать на чистом OpenGL, 3D сцену, на которой будет плоскость с набором картинок.
Здравая идея - если перевести все QPixmap в полигоны с OGL текстурой (это не так сложно) - то ускорение будет
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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