У меня странная проблема с рендерингом 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.
У кого-нибудь есть идея, что здесь происходит?
У меня даже нет идеи, как выяснить, в чем может быть проблема ..
Кто-нибудь пытался реализовать рендеринг из другого потока, как описано в документе, на который я ссылался выше?