Wayland и Qt
Wayland был разработан как альтернатива X11 в Linux. Его основная цель — управлять отображением содержимого приложений на общем экране и взаимодействием пользователя с несколькими приложениями, использующими одни и те же устройства ввода.
Эта роль в операционной системе часто называется сервером отображения. Сервер отображения Wayland также иногда называют композером и менеджером окон, что относится к определённым задачам, выполняемым им в рамках его обязанностей.
В дальнейшем мы дадим краткое введение в Wayland и его роль в Qt. Для получения более подробной информации и сведений о самом Wayland обратитесь к официальной документации.
Что такое сервер отображения
Сервер отображения — это часть операционной системы, которая управляет отображением и другими общими ресурсами. В типичной настольной системе могут одновременно выполняться многие независимые приложения, каждое из которых ожидает возможности отображать графику на экране и получать ввод.
Сервер отображения является связующим звеном между приложением и общими ресурсами, такими как экран и устройства ввода. Типичный сервер отображения в насточной системе помещает содержимое приложения в отдельные прямоугольные «окна», которые пользователь может перемещать и изменять размер. Сервер отображения гарантирует, что содержимое приложения отображается в правильном положении на экране, что активное окно получает ввод с клавиатуры, что перекрывающиеся окна отображаются в правильном порядке и так далее.
В других типах систем сервер отображения может быть более ограниченным. Если экран является панелью приборов в автомобиле или панелью управления вилочным погрузчиком, например, то перемещение и изменение размера окон может быть нежелательным. Вместо этого каждое приложение может быть заблокировано в заранее определённой области экрана и получать ввод с предварительно назначенных устройств.
В любом случае, до тех пор, пока несколько изолированных процессов конкурируют за одни и те же ресурсы, сервер отображения полезен.
Роль Wayland
Имя Wayland может относиться к нескольким связанным элементам:
- Набор протоколов для связи между сервером отображения и его клиентами.
- Библиотека, написанная на C, с функциями для межпроцессного взаимодействия, служащая основой для реализации указанных протоколов.
- Язык на основе XML для расширения протокола, а также инструмент для генерации связующего кода на C из таких расширений.
Qt предоставляет реализации как для клиентской, так и для серверной стороны протокола.
Обычные приложения Qt могут выполняться как клиенты на сервере отображения Wayland путём выбора плагина QPA «wayland» (по умолчанию в некоторых системах). Кроме того, модуль Qt Wayland Compositor может использоваться для разработки самого сервера отображения.
Qt также имеет удобные функции для лёгкого расширения протоколов Wayland с новыми интерфейсами.
Wayland и другие технологии
В настольной системе Linux Wayland является альтернативой X11 и связанным расширениям. В основе своей это сервер композитного отображения, и термин «композер» часто используется для описания сервера Wayland. Это означает, что клиенты будут рендерить содержимое в буфер вне экрана, который впоследствии будет «компонован» с другими клиентами на экране, что позволит применять эффекты окон, такие как тени, прозрачность, размытие фона и так далее.
Важным принципом проектирования исходных протоколов X11 является то, что сервер отображения может работать на тонком терминале только с экраном и устройствами ввода. Клиенты при этом будут работать на удалённых системах с большей вычислительной мощностью, взаимодействуя с сервером по сетевому соединению.
В отличие от этого, Wayland разработан с учётом наблюдения, что в современных конфигурациях клиент и сервер отображения обычно работают на одном оборудовании. Распределённое вычисление, удалённое хранилище и удалённый рабочий стол обычно обрабатываются с помощью других механизмов. Проектирование этого в протокол позволяет совместно использовать графическую память между клиентом и сервером: когда композер размещает содержимое клиента на экране, он может просто скопировать его из одной части графической памяти в другую.
Для оптимальной работы графический драйвер должен поддерживать Wayland. Эта поддержка предоставляется с помощью расширения к EGL, которое называется EXT_platform_wayland.
Примечание: Qt Wayland также поддерживает композицию на системах, где EXT_platform_wayland не поддерживается, либо через XComposite, либо путём копирования содержимого приложения в общую оперативную память. Но для оптимальной производительности рекомендуются системы с поддержкой драйвера.
X11 был расширен для поддержки таких функций, как композиция и прямое рендеринг, но Wayland спроектирован с учётом этого использования с самого начала. Он также стремится быть компактным и расширяемым, в отличие от сложности, которая со временем развилась в X11.
Расширяемость и встраиваемые системы
Поскольку Wayland имеет минимальный ядро и легко расширяется, он является идеальным инструментом при создании встраиваемых платформ Linux.
Например, функции системы окон в стиле настольных компьютеров не являются частью основного протокола. Вместо этого Wayland имеет специальную категорию расширений протокола, называемых «оболочками», которые обеспечивают способ управления клиентом своими поверхностями. Функции в стиле настольных компьютеров предоставляются оболочкой, называемой XDG Shell. Для других типов систем может быть использована более специализированная (и, возможно, более ограниченная) «оболочка». Например, при создании систем инфотейнмента для транспортных средств IVI Shell может быть предпочтительнее.
Сервер Wayland транслирует список поддерживаемых протоколов (или «интерфейсов») при подключении клиента, и клиент может связываться с теми, которые он хочет использовать. Это может быть любой из стандартных интерфейсов, но также легко добавлять новые расширения. Wayland определяет легко понимаемый формат XML для определения протоколов, а инструмент waylandscanner может использоваться для генерации кода C из них. (В Qt у нас также есть qtwaylandscanner, который генерирует дополнительный связующий код C++.)
После того, как клиент свяжется с интерфейсом, он может отправлять «запросы» серверу, а сервер может отправлять «события» клиенту. Запросы и события, а также их аргументы, определены в файле XML, описывающем протокол.
Для создания платформы с нуля, когда вы контролируете код как сервера, так и клиентов, добавление расширений является простым и контролируемым способом добавления функций операционной системы.
Многопроцессная или однопроцессная система
При создании простой встраиваемой платформы с Qt вполне приемлемым вариантом является выполнение всех частей пользовательского интерфейса в одном процессе. Однако по мере усложнения системы вы можете рассмотреть многопроцессную систему. Именно здесь пригождается Wayland. С Qt вы можете на любом этапе разработки переключаться между однопроцессной и многопроцессной системами.
Преимущества многопроцессной системы
Следующие схемы иллюстрируют разницу между многопроцессной и однопроцессной системами.
Многопроцессная архитектура клиента
Однопроцессная архитектура клиента
Модуль Qt Wayland Compositor идеально подходит для создания сервера отображения и композера в многопроцессных системах на встраиваемом Linux. Использование многопроцессной системы имеет следующие преимущества:
| Стабильность | |
|---|---|
| Легче восстановить работоспособность при зависании или сбоях клиентов | Если у вас сложный пользовательский интерфейс, многопроцессная система полезна, потому что если одна часть пользовательского интерфейса выйдет из строя, это не повлияет на всю систему. Аналогично, отображение не замерзнет, даже если один клиент зависнет. Примечание: Если ваш клиент обязан отображать критически важные для безопасности данные, рассмотрите использование Обзора Qt Safe Renderer. |
| Защита от возможных утечек памяти | В многопроцессной системе, если у одного клиента произошла утечка памяти и он потребляет много памяти, эта память освобождается при завершении работы этого клиента. В отличие от однопроцессной системы, утечка памяти сохраняется до перезапуска всей системы. |
| Безопасность |
|---|
| В однопроцессной системе все клиенты могут получать доступ к памяти друг друга. Например, изоляции для передачи конфиденциальных данных нет; каждый оператор кода должен быть одинаково надёжным. Эта изоляция присутствует по умолчанию в многопроцессных системах. |
| Производительность |
|---|
| Если у вас процессор с несколькими ядрами, многопроцессная система может помочь равномерно распределить нагрузку по различным ядрам, более эффективно используя процессор. |
| Совместимость |
|---|
| Вы можете взаимодействовать с клиентами, не использующими Qt, в многопроцессной системе, если ваши клиенты понимают Wayland или X11. Например, если вы используете gstreamer для видео или хотите использовать приложение навигации, созданное с помощью другого инструментария пользовательского интерфейса, вы можете запустить эти клиенты вместе с другими вашими клиентами на основе Qt. |
Недостатки многопроцессной системы
Переходя от однопроцессной к многопроцессной системе, важно учитывать следующие компромиссы:
- Увеличение потребления видеопамяти
- Увеличение потребления оперативной памяти
- Повторное хранение графических ресурсов
- Задержка ввода
| Увеличение потребления видеопамяти |
|---|
| Это может быть ограничением для встраиваемых устройств. В многопроцессной системе каждый клиент нуждается в своём графическом буфере, который он отправляет композеру. В результате вы используете больше видеопамяти по сравнению с однопроцессным случаем: где всё рисуется сразу и нет необходимости хранить различные части в промежуточных буферах. |
| Увеличение потребления оперативной памяти |
|---|
| Помимо некоторой дополнительной нагрузки на уровне ОС, запуск нескольких клиентов может также потребовать больше оперативной памяти, так как некоторые части необходимо дублировать для каждого клиента. Например, если вы запускаете QML, каждый клиент требует отдельного движка QML. Следовательно, если вы запускаете одного клиента, использующего Qt Quick Controls, он загружается один раз. Если затем вы разделите этого клиента на несколько клиентов, Qt Quick Controls будет загружаться несколько раз, что приведет к более высоким затратам на загрузку для инициализации ваших клиентов. |
| Повторное хранение графических ресурсов |
|---|
| В системе с одним процессом, если вы используете одни и те же текстуры, фоны или значки во многих местах, эти изображения хранятся только один раз. В отличие от этого, если вы используете эти изображения в системе с несколькими процессами, вам нужно хранить их несколько раз. В этом случае одним из решений является совместное использование графических ресурсов между клиентами. Qt уже позволяет совместно использовать ресурсы изображений в оперативной памяти между процессами без участия Wayland. С другой стороны, совместное использование текстур графического процессора между процессами требует более сложных решений. В Qt такие решения могут быть разработаны в виде протоколов расширений Wayland и с помощью QQuickImageProvider, например. |
| Задержка от ввода до фотона |
|---|
| В системе с одним процессом приложение напрямую обращается к главному буферу фрейма. Это означает, что задержка между событиями ввода и отображением их на экране может быть минимизирована в такой настройке. В системе с несколькими процессами содержимое приложения должно быть буферизовано втрое, чтобы гарантировать, что клиент не рисует в буферы в то время, когда они одновременно читаются сервером, так как это приведет к разрывам. Это означает, что в системе с несколькими процессами есть неявная задержка. |
Почему использовать Wayland вместо X11 или пользовательских решений
Как описано ранее, X11 не является оптимальным вариантом для типичных системных настроек сегодня. Он довольно большой и сложный, и ему не хватает настраиваемости. Фактически, сложно запустить клиент плавно с X11 и достичь 60 кадров в секунду без разрывов. Wayland, напротив, проще в реализации, имеет лучшую производительность и содержит все необходимые части для эффективной работы на современной графической аппаратуре. Для встраиваемых многопроцессорных систем на Linux Wayland является стандартом.
Однако, если вы работаете со старым оборудованием или устаревшими приложениями, Wayland может не быть лучшим вариантом. Протокол Wayland разработан с учетом безопасности и изоляции, и он строго/осторожно относится к тому, какая информация и функциональность доступны клиентам. Хотя это приводит к более чистому и безопасному интерфейсу, некоторые функции, ожидаемые от устаревших приложений, могут больше не быть доступны в Wayland.
В частности, существуют три распространённых случая, когда Wayland может не быть лучшим вариантом:
- Аппаратное обеспечение или платформа устарели и поддерживают только X11; в этом случае у вас нет выбора.
- Вам необходимо поддерживать устаревшие приложения, которые зависят от функций, отсутствующих в протоколе Wayland из-за соображений безопасности и простоты.
- Вам необходимо поддерживать устаревшие приложения, которые используют набор инструментов пользовательского интерфейса, не работающий в Wayland. В некоторых случаях вы можете обойти это, запустив эти приложения в XWayland вместо этого.
В то время, когда X11 был очень популярен, разработчики создавали свои собственные пользовательские решения, чтобы обойти проблемы X11. Более ранние версии Qt имели систему окон Qt (QWS), которая сейчас прекратила поддержку. Сегодня большинство этих случаев покрываются Wayland, и пользовательские решения становятся всё менее распространёнными.
Что предлагает Qt Wayland
Для клиентов Клиенты Qt могут работать на любом композиторе Wayland, включая Weston, эталонный композитор, разработанный в рамках проекта Wayland.
Любое приложение Qt может работать как клиент Wayland (в рамках многопроцессорной системы) или автономный клиент (однопроцессорный). Это определяется при запуске, где вы можете выбрать между различными бэкендами. Во время процесса разработки вы можете сначала разработать клиент на рабочем столе, а затем протестировать его на целевом оборудовании позже. Вам не нужно постоянно запускать свои клиенты на фактическом целевом оборудовании.
Разработка клиента с одним процессом
Если вы разрабатываете на машине Linux, вы также можете запустить композитор в окне на вашей машине разработки. Это позволяет вам запускать клиентов в среде, которая тесно соответствует целевому устройству. Не перестраивая клиент, вы также можете запустить его с -platform wayland для запуска внутри композитора. Если вы используете -platform xcb (для X11), вы можете запустить клиент на рабочем столе. Другими словами, вы можете начать разработку своих клиентов до того, как композитор будет готов к использованию.
Для серверов Сервер, или композитор, подключается к дисплею и отображает содержимое каждого клиента на экране. Композитор обрабатывает ввод и отправляет события ввода соответствующему клиенту. В свою очередь, каждый клиент подключается к композитору и отправляет содержимое своих окон. За композитором сохраняется право:
- Определять, как и где отобразить содержимое
- Определять, какое содержимое отобразить
- Решать, что делать с различными графическими буферами клиентов
Это означает, что композитор решает, что такое многопроцессорная система. Например, клиенты могут быть частью 3D-сцены с окнами на стенах, на VR-системе, спроецированной на сферу и так далее.
Композитор Qt Wayland — это API для создания собственного композитора. Он предоставляет полную свободу для создания пользовательского интерфейса композитора и управления окнами различных клиентов. Вы можете сочетать Qt Quick и QML с Qt Wayland Compositor для создания впечатляющих и воображаемых пользовательских интерфейсов. Дополнительную информацию см. в Qt Wayland Compositor.
Qt также предоставляет мощные и удобные API для реализации расширений Wayland и использования их из QML или C++.
Связанные материалы
- QtWS17 - Qt Wayland Compositor: Создание многопроцессорного пользовательского интерфейса
- Qt Application Manager
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/wayland-and-qt.html