LINUX.ORG.RU

Лаги при перемещении QGraphicsItem

 ,


0

1

Имеется QGraphicsScene с расположенным на нём QGraphicsItem. На QGraphicsItem стоит флаг ItemIsMovable, поэтому его можно двигать мышкой. Отображается это всё через QGraphicsView. Если у последнего viewport'ом является QWidget (по умолчанию), то всё нормально работает. Если же сделать так:

m_view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers), this));

то становится заметным сильная задержка перемещения item'а относительно перемещения мыши. Т.е. если быстро передвинуть мышь, то item не успевает сразу переместиться за мышью, а делает это с задержкой.

Подозреваю, что проблема в том, что OpenGL каждый раз перерисовывает сцену при изменениях, поэтому и появляются лаги при частом перемещении item'а на 1 пиксель за мышью. Можно ли как-то исправить ситуацию с учётом этого, или придётся отказаться от отрисовки через OpenGL? Какие вообще преимущества отрисовки QGraphicsView через QGLWidget перед отрисовкой через QWidget?

Имеется аналогичная вещь, все работает плавно (поверх довольно тяжелой OpenGL сцены). nvidia GT 425M, блоб.

unfo ★★★★★
()

В Qt 4.x OGL-рендер работает заметно медленнее их софтварной растеризации. Что там и как в Qt 5 пока непонятно, у меня в демках черное окно при переключении на OpenGL :)

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

Имеется аналогичная вещь, все работает плавно (поверх довольно тяжелой OpenGL сцены). nvidia GT 425M, блоб.

У меня intel i915, на нём очень лагает. Сейчас протестировал на nvidia 6600GT с блобом, тоже лагает, но не так сильно.

Кстати, с nvidia какая-то странная вещь получается. Если без OpenGL, то всё нормально, а если с OpenGL, то в консоли происходит следующее:

NVIDIA: could not open the device file /dev/nvidiactl (Отказано в доступе).
NVIDIA: could not open the device file /dev/nvidiactl (Отказано в доступе).
NVIDIA: could not open the device file /dev/nvidiactl (Отказано в доступе).
Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile
Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile
Errors linking simple shader: "" 
Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile
Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile
Errors linking blit shader: "" 
Warning: "" failed to compile! 
Warning: "" failed to compile! 
Warning: "" failed to compile!

(последняя строчка много раз)

и ничего не отрисовывается. Если дать права доступа к /dev/nvidiactl и /dev/nvidia0 и запустить с OpenGL, то работает с небольшими лагами. Зачем ему права доступа к этим девайсам, и почему kwin работает без них, а моя программа не может?

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

В Qt 4.x OGL-рендер работает заметно медленнее их софтварной растеризации.

OK, видимо, придётся его выкинуть. Зачем он тогда вообще нужен? Есть задачи, в которых он справляется лучше?

Что там и как в Qt 5 пока непонятно, у меня в демках черное окно при переключении на OpenGL :)

У меня был чёрный экран (либо отсутствие стирания устаревшего содержимого сцены) с Qt 4, если задать непустой stylesheet любого содержания.

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

OK, видимо, придётся его выкинуть. Зачем он тогда вообще нужен? Есть задачи, в которых он справляется лучше?

Частные случаи наверняка есть, когда лучше. Но это явно не касается сложной динамической геометрии. Теоретически 2d-графика должна быть ускорена на GPU - это верный вектор развития для библиотеки. На практике у них вышло не очень, но в любом случае пилить это надо, иначе можно остаться на обочине прогресса как какой-нибудь wxWidgets.

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