Я чувствую, что ответ Пола может быть немного жаргонным, так что вот моя попытка.
Существует множество устройств отображения (мониторы VGA, композитное видео, HDMI и т. д.), и они, как правило, обрабатываются непосредственно аппаратно, например. в специальном графическом процессоре (GPU).
Вместо того, чтобы наши приложения взаимодействовали с этим оборудованием напрямую, мы используем драйверы (которые находятся внутри нашего ядра операционной системы). Разному оборудованию нужны разные драйверы, но всем драйверам можно дать инструкции, используя один и тот же интерфейс, например OpenGL:
App --OpenGL--> Driver --> Hardware --VGA--> Screen
Конечно, как и большинство стандартов, на самом деле существует целая куча разных! OpenGL поддерживается большинством драйверов в большинстве операционных систем; его подмножество «OpenGL ES» хорошо работает на мобильных телефонах, и существуют «программные драйверы», которые могут создавать изображения на основе инструкций OpenGL (и все драйверы могут рисовать изображения, хотя это намного медленнее, чем использование реальная поддержка OpenGL). Крупным конкурентом OpenGL является DirectX, но он работает только на Windows и XBox.
Рендеринг в OpenGL подходит для чего-то вроде полноэкранной 3D-игры, но графическая система *NIX (известная как "X") предлагает две основные функции: рисование нескольких приложений на одном и том же экран и рисование по сети. Для этого на экран выводится серверный процесс, и приложения («клиенты») взаимодействуют с этим сервером, используя «протокол X11» («11» — это просто номер версии):
App A ----------OpenGL-------+
|
App B --+ |
| |
+--X11--> X server --+----> Driver --> Hardware --> Screen
|
App C --+
|
...network ...
|
App D --+
X, как правило, имеет прямой доступ к драйверам, поскольку существует дольше, чем OpenGL, но это не так уж важно.
Протокол X11 работает, когда приложения создают окна, в которых им разрешено рисовать. X может размещать эти окна на экране, в том числе перекрывать их. Приложения, использующие OpenGL, могут «пропускать» свои команды через X прямо в драйвер, и X по-прежнему упорядочивает окно так же, как и любое другое (это не будет работать по сети, поскольку оно обходит сетевые возможности X11).
Обычно у нас есть приложение, предназначенное для упорядочивания, скрытия/отображения и закрытия окон, называемое менеджером окон. При желании оконный менеджер может создать несколько тонких окон по краям других, чтобы он мог рисовать заголовки, изменять размеры ручек и т. д.
Протокол X11 включает команды для рисования фигур, рендеринга шрифтов и т. д., и есть приложения, которые используют их напрямую, например, программа xterm
и оконный менеджер twm
:
xterm --+
|
+--X11--> X --> Driver --> ...
|
twm --+
Однако большинство современных приложений считают необработанный X11 слишком утомительным; вместо того, чтобы рисовать линии и фигуры, мы бы предпочли рисовать целые виджеты (кнопки, меню, значки и т. д.). Для этого были созданы наборы инструментов. Два наиболее известных из них называются Qt и GTK+ (набор инструментов GIMP, поскольку он изначально был создан для GIMP); другие включают Motif, Lesstif, ETK, Tk и FLTK. Мы можем попросить инструментарий нарисовать кнопку, и он отправит все необходимые команды X11 для рисования кнопки, а также позаботится о размере и положении, обновляя рисунок, если что-то перекрывает его. уходит, сообщая нашему коду, когда кнопка была нажата, а некоторые инструменты даже позволяют изменять внешний вид виджетов с помощью темы. Некоторые наборы инструментов также являются кроссплатформенными, поэтому они будут отправлять команды X11 в Linux, разные команды в Windows, OSX и т. д.
Rhythmbox --> GTK+ --+
|
GIMP --> GTK+ --+
|
Amarok --> Qt --+--X11--> X --> Driver --> ...
|
Skype --> Qt --+
|
aMSN --> Tk --+
Некоторые наборы инструментов предлагают функции поверх других; например, wxWidgets
заставляет Qt выполнять отрисовку (в Linux; Windows и OSX являются "родными"), XUL
используется Firefox и использует GTK+ для отрисовки:
Audacity --> wxWidgets --> Qt --+
|
Firefox --> XUL --> GTK+ --+--X11--> X --> Driver --> ...
|
GIMP ----------------> GTK+ --+
Важно отметить, что команды X11 для рисования фигур и текста на самом деле используются не очень часто, поскольку они очень примитивны. Многие наборы инструментов на самом деле отображают свои виджеты как изображения, а затем заставляют X рисовать эти изображения. Новая система Wayland пытается заменить X, отказываясь от команд рисования и позволяя приложениям и наборам инструментов напрямую использовать OpenGL, что должно сделать работу намного быстрее.
Вы упомянули разные среды рабочего стола, такие как GNOME и KDE, и то, работают ли они вместе. В основном это большие наборы приложений, написанных для совместной работы. Так получилось, что все приложения GNOME написаны на GTK+, а приложения KDE — на Qt.
Если вы посмотрите на стрелки на моих диаграммах выше, вы заметите, что каждое приложение Qt взаимодействует с X отдельно, каждое приложение GTK+ взаимодействует с X отдельно и т. д.; не только приложение Qt и приложение GTK+ могут работать бок о бок, что касается X, это то же самое, что два приложения Qt или два приложения GTK+!
Единственное, о чем следует беспокоиться при смешивании рабочих столов, — это о том, конкурируют ли два приложения за выполнение одной и той же работы, например, если вы пытаетесь запустить два оконных менеджера или две панели рабочего стола. Обратите внимание, что это не проблема графики, наборов инструментов и т. д., поскольку у меня возникнут те же проблемы, если я буду использовать два рабочих стола, созданных на основе одного и того же набора инструментов (например, lxpanel и gnome-panel написаны на GTK+, но они все равно будут мешать друг другу!)
person
Community
schedule
29.11.2014