Метод QGLWidget paintGL(), вызываемый из какого потока Qt?

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

Спасибо

2 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам