Spec-Zone.ru › Qt

Qt для Windows — Ускорение графики

Для работы Qt Quick требуется графический драйвер, предоставляющий Direct 3D 11.1, Vulkan 1.0 или OpenGL 2.1 или более позднюю версию. Начиная с Qt 6, по умолчанию для Qt Quick на Windows используется Direct3D 11. Это отличается от Qt 5, где по умолчанию использовался OpenGL, либо напрямую, либо через ANGLE, переводчик OpenGL в Direct3D. ANGLE больше не поставляется с Qt в Qt 6.

Чтобы принудительно использовать программный растризатор Direct3D (WARP), установите переменную среды QSG_RHI_PREFER_SOFTWARE_RENDERER в значение 1.

Чтобы запросить использование Vulkan или OpenGL, для которых требуется установленный драйвер Vulkan или OpenGL, установите переменную среды QSG_RHI_BACKEND в значение vulkan или opengl, или используйте эквивалентный API на C++ в main().

Несмотря на то, что OpenGL не является по умолчанию для Qt Quick, он всё ещё широко используется во многих приложениях Qt, например, в приложениях на основе QWidget, использующих QOpenGLWindow или QOpenGLWidget. В следующих разделах рассматриваются некоторые особенности OpenGL в сборке Qt.

Динамическая загрузка OpenGL

Qt поддерживает выбор и загрузку реализации OpenGL во время выполнения. Этот режим является по умолчанию и может быть явно запрошен путём передачи -opengl dynamic скрипту конфигурации.

configure -opengl dynamic

Эта конфигурация является наиболее гибкой, поскольку зависимости и предположения о реализации OpenGL не зашиты в коде во время компиляции. Это позволяет надёжную установку приложения. Если данная среда не предоставляет должную реализацию OpenGL 2.0, она автоматически переключится на загрузку альтернативы opengl32.dll, по умолчанию имя которой opengl32sw.dll. В предварительно собранных пакетах Qt поставляется сборка Mesa llvmpipe, программная реализация растрирования OpenGL, под этим именем.

При конфигурации с -opengl dynamic, ни Qt, ни приложения, созданные с использованием qmake или CMake, не будут ссылаться на opengl32.lib. Вместо этого библиотека выбирается и загружается во время выполнения. По умолчанию Qt определяет, предоставляет ли системный opengl32.dll функции OpenGL 2. Если они присутствуют, используется opengl32.dll, в противном случае пытается загрузить opengl32sw.dll. Подробности см. ниже.

Механизм загрузки можно настроить с помощью переменной среды QT_OPENGL и следующих атрибутов приложения:

  • Qt::AA_UseDesktopOpenGL Эквивалентно установке QT_OPENGL в значение desktop.
  • Qt::AA_UseOpenGLES Не имеет эффекта в Qt 6.
  • Qt::AA_UseSoftwareOpenGL Эквивалентно установке QT_OPENGL в значение software.

Когда определённая конфигурация запрашивается явно, никакие проверки не выполняются при запуске приложения, то есть системный opengl32.dll не будет проверяться.

Динамическая загрузка оказывает существенное влияние на приложения, содержащие собственные вызовы OpenGL: они могут не связаться, так как opengl32.lib не автоматически указывается компоновщику. Вместо этого приложения должны использовать функции OpenGL через класс QOpenGLFunctions. Таким образом, прямая зависимость от библиотеки OpenGL устраняется, и все вызовы будут перенаправлены во время выполнения на реализацию, выбранную Qt. В качестве альтернативы, приложения могут выполнять прямые вызовы функций OpenGL, если они добавляют opengl32.lib в свои файлы проекта .pro: LIBS += opengl32.lib (Visual Studio) или LIBS += -lopengl32 (MinGW). Результат, с точки зрения приложения, эквивалентен конфигурации сборки -opengl desktop Qt.

Qt::AA_UseSoftwareOpenGL является особым случаем, поскольку будет пытаться загрузить реализацию OpenGL с нестандартным именем. По умолчанию имя opengl32sw.dll. Это позволяет поставлять только программную реализацию OpenGL, например, сборку Mesa с llvmpipe, под этим именем. При необходимости имя файла можно переопределить, установив переменную среды QT_OPENGL_DLL.

Возможно предоставить конфигурационный файл в формате JSON, определяющий, какую реализацию OpenGL использовать в зависимости от графической карты и версии драйвера. Путь указывается переменной среды QT_OPENGL_BUGLIST. Относительные пути разрешаются с использованием QLibraryInfo::SettingsPath или QStandardPaths::ConfigLocation. Файл использует формат списка ошибок драйвера, используемый в Проектах Chromium. Он состоит из списка записей, каждая из которых определяет набор условий и список ключевых слов функций. Как правило, для сопоставления конкретной графической карты используются идентификаторы устройства и поставщика. Их можно найти в выводе инструмента qtdiag6 или dxdiag.

Следующие ключевые слова функций важны для выбора реализации OpenGL:

Примечание: В Qt 6 устаревшие ключевые слова, связанные с ANGLE (disable_angle, disable_d3d11, disable_d3d9), принимаются, но не имеют эффекта.

  • disable_desktopgl - Отключает OpenGL. Это гарантирует, что Qt не попытается использовать обычный OpenGL (opengl32.dll) и сразу же начнёт с ANGLE. Это полезно для предотвращения сбоев приложения из-за плохих драйверов OpenGL.
  • disable_rotation - Принудительно устанавливает ориентацию приложения в альбомную всегда. Не имеет эффекта при использовании программной реализации OpenGL. Это предназначено для драйверов, у которых есть проблемы с поворотом.
  • disable_program_cache - Отключить сохранение двоичных данных программы шейдеров на диск.

Пример файла:

{
"entries": [
{
  "id": 1,
  "description": "Disable D3D11 on older nVidia drivers",
  "os": {
    "type": "win"
  },
  "vendor_id": "0x10de",
  "device_id": ["0x0DE9"],
  "driver_version": {
    "op": "<=",
    "value": "8.17.12.6973"
  },
  "features": [
    "disable_d3d11"
  ]
},
...

Когда QT_OPENGL_BUGLIST не указан, используется встроенный список. В него обычно входят некоторые более старые, менее производительные графические карты с disable_desktopgl для предотвращения использования Qt их нестабильных реализаций OpenGL и вместо этого сразу же перейти к попытке загрузки программной альтернативной библиотеки.

На практике ожидаются следующие наиболее распространённые комбинации:

  • disable_desktopgl - В случае, если система предоставляет OpenGL 2.0 или более новую версию, но известно, что драйвер нестабилен и склонен к ошибкам.
  • disable_desktopgl, disable_angle - Если не требуется ускоренный путь. Это гарантирует, что Qt будет пытаться только использовать программный растризатор (opengl32sw.dll). Может быть полезно в виртуальных машинах и приложениях, которые развернуты на широком спектре старых систем.

Поддерживаемые ключи для сопоставления заданной карты или драйвера. Обратите внимание, что некоторые из них специфичны для Qt.

  • os.type - Операционная система: win, linux, macosx, android
  • os.version - Версия ядра
  • os.release - Указывает список релизов операционных систем Windows: xp, vista, 7, 8, 8.1, 10.
  • vendor_id - Производитель из идентификатора адаптера
  • device_id - Список идентификаторов устройств PCI.
  • driver_version - Версия драйвера из идентификатора адаптера
  • driver_description - Совпадает, когда значение является подстрокой описания драйвера из идентификатора адаптера
  • gl_vendor - Совпадает, когда значение является подстрокой строки GL_VENDOR

Для отключения всего чёрного списка установите переменную среды QT_NO_OPENGL_BUGLIST в любое значение. Это пропустит чтение любых конфигурационных файлов и предположит, что ничего не отключено, независимо от драйвера или ОС.

Примечание: Хотя это обычно не требуется, QT_NO_OPENGL_BUGLIST может стать актуальным в определённых виртуализированных средах с несколькими, возможно виртуальными, графическими адаптерами. Если журналы из категорий, таких как qt.qpa.gl, указывают, что обнаружение драйвера и графического адаптера приводит к неверному отключению OpenGL, рекомендуется установить эту переменную среды, чтобы приложение работало нормально. Эта переменная среды была введена в Qt 5.15.

Прямая зависимость от opengl32.dll

Альтернативой по умолчанию dynamic сборкам OpenGL является прямая зависимость от opengl32.dll. Для этого режима передайте опции командной строки -opengl desktop скрипту конфигурации.

configure -opengl desktop

Примечание: Использование EGL и OpenGL ES не поддерживается в Windows. В Qt 6 OpenGL на Windows всегда подразумевает использование WGL в качестве интерфейса системы окон.

В таких сборках Qt многие общие библиотеки Qt, а также приложения Qt будут иметь зависимость от opengl32.dll, и поэтому использование альтернативной библиотеки невозможно.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/windows-graphics.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API