Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Torvald от Сентябрь 09, 2012, 12:20



Название: Медленный updateGL
Отправлено: Torvald от Сентябрь 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, окно перемещается плавно


Название: Re: Медленный updateGL
Отправлено: Torvald от Сентябрь 09, 2012, 12:54
Решил проблему поменяв в конструкторе QGL::SingleBuffer


Название: Re: Медленный updateGL [SOLVED]
Отправлено: Torvald от Сентябрь 09, 2012, 20:00
Хотя нет, это конечно не решает проблему. Двойная буфферизация нужна, иначе мерцать все будет.
Я выяснил почему так долго работает функция updateGL. На самом деле долго работает swapBuffers().
А работает она долго, потому что в настойках видеокарты у меня стоит принудительная вертикальная синхронизация для OpenGL. Если ее отключить, то все нормально - работает быстро. Однако как быть тем, у кого стоит принудительная вертикальная синхронизация? Эти небольшие фризы все таки заметны и режут глаз. Не говорить же каждому пользователю что бы он отключил синхронизацию) А средствами OpenGL как ее отключить не знаю. Вернее есть функция QGLFormat::setSwapInterval(), которая позволяет включить или отключить ее, однако она не работает, если включена принудительная вертикальная синхронизация...
Интересно что в игре warmux все летает, нет никаких фризов. Правда там используется SDL. Посмотрел еще alien arena, там тоже нет таких тормозов, там точно OpenGL используется.
В общем хочется найти какой то выход из положения


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



Название: Re: Медленный updateGL
Отправлено: Bender от Январь 13, 2013, 09:43
Да, действительно, тормоза исчезли)))
Правда на одном ПК была интегрированная Intel HD. И хоть я поставил там что вертикальная синхронизация "выбирается приложением". Всё равно не смог отключить её. Пробовал и ч/з функции qt и ч/з WinApi. Пришлось купить дешёвую видеокарту и и теперь всё ок!

Но вопрос до конца так и не снят!!!