Qt QGLWidget рендеринг OpenGL из потоковых блоков в swapBuffers () - PullRequest
3 голосов
/ 06 ноября 2011

У меня странная проблема с рендерингом OpenGL в QGLWidget из другого потока, отличного от основного потока.

Существует много официальных заявлений разработчиков Qt о том, что "совершенно возможно" выполнять рендеринг из другого потока. Я последовал объяснению в:

http://doc.qt.nokia.com/qq/qq06-glimpsing.html#writingmultithreadedglapplications

Я реализовал это почти так же. Единственное отличие состоит в том, что я не использую QWorkspace с другими GLWidget, но вместо этого я просто создаю MainWindow с GLWidget в качестве центрального виджета.

Когда я запускаю приложение, поток рендеринга начинает рендеринг кадров с треугольником в произвольной позиции. Через некоторое время (иногда 2 секунды, иногда 10 секунд) поток начинает блокировать вызов swapBuffers () на очень долгое время. Иногда swapBuffers () возвращается самопроизвольно через несколько секунд. Когда я перемещаю указатель мыши над виджетом или основным окном, swapBuffers немедленно возвращается, и пока я перемещаю указатель мыши, swapBuffers () не блокируется. После перемещения мыши из виджета или просто прекращения перемещения мыши рендеринг продолжается в течение нескольких секунд, а затем блоки swapBuffers снова начинают блокироваться.

У меня нет абсолютно никакого объяснения этому поведению. Я знаю, что регулярные swapBuffers () блокируют до завершения кадра, и мне также ясно, что ожидание vsync также может произойти во время вызова подкачки буфера OpenGL. Но это должно произойти за несколько миллисекунд, а не блокироваться в течение нескольких секунд. Среда X11 с GLX.

У кого-нибудь есть идея, что здесь происходит? У меня даже нет идеи, как выяснить, в чем может быть проблема ..

Кто-нибудь пытался реализовать рендеринг из другого потока, как описано в документе, на который я ссылался выше?

...