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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Медленный updateGL  (Прочитано 5874 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« : Сентябрь 09, 2012, 12:20 »

Столкнулся с такой проблемой: updateGL() по времени выполняется довольно долго (8-12мс), в то время как paintGL() менее 1мс.
В paintGL я рисую не много - вообще ничего не рисую, только буфер очищаю. В своей программе я по таймеру каждые 16мс вызываю функцию updateGL(), при этом, как я уже сказал, отрисовка происходит долго (почему так? Ощущение, как будто каждый пиксель на виджете рисуется процессором через отдельную функцию.)
Если я по таймеру вызываю paintGL(), то все нормально, рендер занимает не много времени, но на виджете ничего не отображается. Если при этом вызывать updateGL(), то отобразится все что нарисовалось при вызовах paintGL().
Как сделать так, что бы обновление виджета не занимало столько времени?
Вот код:
Код:
Widget::Widget(QGLWidget *parent): QGLWidget(QGLFormat(QGL::DoubleBuffer), parent){
}


void Widget::initializeGL(){
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
glClearColor(1, 1, 1, 1);

timer.start(16, this);
}

void Widget::timerEvent(QTimerEvent *){
time.start();
updateGL();//8-12мс
//paintGL();//<1мс
setWindowTitle(QString::number(time.elapsed()));
}

void Widget::resizeGL(int w, int h){
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void Widget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT);
}
Kubuntu 12.04
Qt 4.8.1

Кстати, если вместо updateGL вызывать просто update, то время отрисовки показывает <0мс, однако по ощущениям ничего не изменилось (может быть update вызывается асинхронно?) - если перемещать окно по рабочему столу, оно двигается рывками, так же как и при updateGL. При paintGL, окно перемещается плавно
« Последнее редактирование: Сентябрь 09, 2012, 20:00 от Torvald » Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #1 : Сентябрь 09, 2012, 12:54 »

Решил проблему поменяв в конструкторе QGL::SingleBuffer
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #2 : Сентябрь 09, 2012, 20:00 »

Хотя нет, это конечно не решает проблему. Двойная буфферизация нужна, иначе мерцать все будет.
Я выяснил почему так долго работает функция updateGL. На самом деле долго работает swapBuffers().
А работает она долго, потому что в настойках видеокарты у меня стоит принудительная вертикальная синхронизация для OpenGL. Если ее отключить, то все нормально - работает быстро. Однако как быть тем, у кого стоит принудительная вертикальная синхронизация? Эти небольшие фризы все таки заметны и режут глаз. Не говорить же каждому пользователю что бы он отключил синхронизацию) А средствами OpenGL как ее отключить не знаю. Вернее есть функция QGLFormat::setSwapInterval(), которая позволяет включить или отключить ее, однако она не работает, если включена принудительная вертикальная синхронизация...
Интересно что в игре warmux все летает, нет никаких фризов. Правда там используется SDL. Посмотрел еще alien arena, там тоже нет таких тормозов, там точно OpenGL используется.
В общем хочется найти какой то выход из положения
Записан
Bender
Гость
« Ответ #3 : Январь 10, 2013, 20:32 »

Завтра попробую...
В моей программе несколько потоков. А при вращении модели начинаются жуткие тормоза во всех потоках. После исследования я тоже понял, что тормозит updateGL();. Временно помогло  QTimer::singleShot(10,this,updateGL()); А сейчас переставил дрова и тормоза опять вернулись...Самое странное что загрузка ПК всего пк 5%.
Вот моя прога...
http://www.youtube.com/watch?feature=player_embedded&v=p8AVWA25SXE

Записан
Bender
Гость
« Ответ #4 : Январь 13, 2013, 09:43 »

Да, действительно, тормоза исчезли)))
Правда на одном ПК была интегрированная Intel HD. И хоть я поставил там что вертикальная синхронизация "выбирается приложением". Всё равно не смог отключить её. Пробовал и ч/з функции qt и ч/з WinApi. Пришлось купить дешёвую видеокарту и и теперь всё ок!

Но вопрос до конца так и не снят!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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