Метод QGLWidget paintGL (), вызываемый из какого потока Qt? - PullRequest
2 голосов
/ 16 октября 2011

предположим, что я использую метод paintGL () QGLWidget для рисования в виджет с использованием OpenGL.После того, как Qt вызвал метод paintGL (), он автоматически запускает замену буфера.В OpenGL этот обмен буферов обычно блокирует вызывающий поток до тех пор, пока не завершится рендеринг кадра в фоновый буфер, верно?Интересно, какой поток Qt вызывает paintGL, а также замену буфера.Это основной поток Qt UI?Если это так, не означает ли это, что блок во время замены буфера также блокирует весь пользовательский интерфейс?Я не смог найти никакой информации об этом процессе в целом ..

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Я не часто использую QGLWidget, но учтите, что да, если swapBuffers () является синхронным, поток Qt GUI застревает.Это означает, что во время этой операции вы не сможете обрабатывать события.

В любом случае, если у вас возникли трудности во время этого, рассмотрите чтение этой статьи , которая позволяет многопоточному OpenGLпреодолеть эту трудность.

Еще лучше, эта статья хорошо объясняет ситуацию и представляет новые возможности многопоточности OpenGL в Qt 4.8, который теперь находится в версии-кандидате.

0 голосов
/ 16 октября 2011

В OpenGL этот обмен буфера обычно блокирует вызывающий поток до тех пор, пока не завершится рендеринг кадра в фоновый буфер, верно?

Это зависит от того, как он реализован.Что означает, что оно варьируется от оборудования к оборудованию и от драйвера к драйверу.

Если это так, не означает ли это, что блок во время замены буфера также блокирует весь пользовательский интерфейс?

Даже если он блокирует, он будет делать это только в течение 1/60 секунды.Возможно 1/30, если ваша игра замедляется.Если вы действительно медленный, 1/15.Самое большее одно нажатие клавиши или действие мыши, которое дает пользователь, все еще будет в очереди сообщений.

Проблема с блокировкой не связана с пользовательским интерфейсом.Это будет достаточно отзывчивым, чтобы пользователь не заметил.Но если у вас есть строгие временные ограничения (например, для игры), я бы рекомендовал вообще избегать paintGL.Вы должны делать рендеринг, когда хотите, а не когда Qt говорит вам об этом.

...