Desktop Window Manager ( DWM , ранее Desktop Compositing Engine или DCE ) — это менеджер окон композитинга в Microsoft Windows , начиная с Windows Vista , который позволяет использовать аппаратное ускорение для визуализации графического пользовательского интерфейса Windows.
Первоначально он был создан для включения частей нового пользовательского опыта " Windows Aero ", который позволял использовать такие эффекты, как прозрачность, переключение 3D-окон и многое другое. Он также включен в Windows Server 2008 , но требует установки функции "Desktop Experience" и совместимых графических драйверов. [1]
Desktop Window Manager — это композитный оконный менеджер , то есть у каждой программы есть буфер, в который она записывает данные; затем DWM компонует буфер каждой программы в окончательное изображение. Для сравнения, стековый оконный менеджер в Windows XP и более ранних версиях (а также Windows Vista и Windows 7 с отключенным Windows Aero) включает в себя один буфер дисплея, в который все программы записывают данные.
DWM работает по-разному в зависимости от операционной системы (Windows 7 или Windows Vista) и версии используемых графических драйверов ( WDDM 1.0 или 1.1). В Windows 7 и с драйверами WDDM 1.1 DWM записывает буфер программы только в видеопамять, даже если это программа графического интерфейса устройства (GDI). Это связано с тем, что Windows 7 поддерживает (ограниченное) аппаратное ускорение для GDI [2] и при этом не нуждается в хранении копии буфера в системной памяти, чтобы ЦП мог записывать в нее данные.
Поскольку компоновщик имеет доступ к графике всех приложений, он легко позволяет визуальным эффектам, которые связывают визуальные элементы из нескольких приложений, например, прозрачность. DWM использует DirectX для выполнения функции компоновки и рендеринга в графическом процессоре, освобождая центральный процессор от задачи управления рендерингом из внеэкранных буферов на дисплей. Однако это не влияет на отрисовку приложений в внеэкранных буферах — в зависимости от используемых для этого технологий, это все еще может быть связано с процессором. DWM-независимые методы рендеринга, такие как GDI, перенаправляются в буферы путем рендеринга пользовательского интерфейса (UI) в виде растровых изображений . Технологии рендеринга с поддержкой DWM, такие как WPF, напрямую делают внутренние структуры данных доступными в формате, совместимом с DWM. Затем содержимое окна в буферах преобразуется в текстуры DirectX.
Сам рабочий стол представляет собой полноэкранную поверхность Direct3D , при этом окна представлены в виде сетки, состоящей из двух смежных (и взаимно перевернутых) треугольников, которые преобразуются в 2D-прямоугольник. Затем текстура, представляющая хром пользовательского интерфейса, накладывается на эти прямоугольники. Переходы окон реализуются как преобразования сеток с использованием шейдерных программ. [3] В Windows Vista переходы ограничены набором встроенных шейдеров, которые реализуют преобразования. Грег Шехтер, разработчик в Microsoft, предположил, что это может быть открыто для разработчиков и пользователей, чтобы подключать свои собственные эффекты в будущем выпуске. [4] DWM отображает только основной объект рабочего стола как 3D-поверхность; другие объекты рабочего стола, включая виртуальные рабочие столы, а также защищенный рабочий стол, используемый контролем учетных записей пользователей, не отображаются. [5]
Поскольку все приложения визуализируются в буфере за пределами экрана, их также можно считывать из буфера, встроенного в другие приложения. Поскольку буфер за пределами экрана постоянно обновляется приложением, встроенный рендеринг будет динамическим представлением окна приложения, а не статическим. Именно так работают живые миниатюры и Windows Flip в Windows Vista и Windows 7. DWM предоставляет общедоступный API, который позволяет приложениям получать доступ к этим представлениям миниатюр. [6] Размер миниатюры не фиксирован; приложения могут запрашивать миниатюры любого размера — меньше исходного окна, того же размера или даже больше — и DWM будет правильно масштабировать их перед возвратом. Aero Flip не использует общедоступные API миниатюр, поскольку они не позволяют напрямую обращаться к текстурам Direct3D. [7] Вместо этого Aero Flip реализован непосредственно в движке DWM.
Desktop Window Manager использует Media Integration Layer (MIL), неуправляемый компоновщик, который он разделяет с Windows Presentation Foundation , для представления окон как узлов композиции в дереве композиции . Дерево композиции представляет рабочий стол и все окна, размещенные в нем, которые затем визуализируются MIL от задней части сцены к передней. [8] Поскольку все окна вносят вклад в конечное изображение, цвет результирующего пикселя может быть определен более чем одним окном. Это используется для реализации таких эффектов, как попиксельная прозрачность. DWM позволяет вызывать пользовательские шейдеры для управления тем, как пиксели из нескольких приложений используются для создания отображаемого пикселя. DWM включает встроенные программы Pixel Shader 2.0, которые вычисляют цвет пикселя в окне путем усреднения цвета пикселя, определенного окном за ним и его соседними пикселями. Эти шейдеры используются DWM для достижения эффекта размытия на границах окон, управляемых DWM, и, опционально, для областей, где это запрашивается приложением. [3]
Поскольку MIL обеспечивает графическую систему с сохраненным режимом путем кэширования деревьев композиции, работа по перерисовке и обновлению экрана при перемещении окон выполняется DWM и MIL, освобождая приложение от ответственности. Фоновые данные уже находятся в дереве композиции и внеэкранных буферах и напрямую используются для рендеринга фона. В ОС Windows до Vista фоновые приложения должны были быть запрошены для повторного рендеринга, отправив им сообщение WM_PAINT
. [6] DWM использует графику с двойной буферизацией для предотвращения мерцания и разрывов при перемещении окон. [3] [6] Движок композиции использует оптимизации, такие как отбраковка, для повышения производительности, а также не перерисовывает области, которые не изменились. [8] Поскольку компоновщик поддерживает несколько мониторов, DWM изначально поддерживает и это. [8]
В полноэкранных приложениях, таких как игры, DWM не выполняет композицию окон, поэтому производительность не будет существенно снижаться.
В Windows 8 и Windows Server 2012 DWM используется постоянно и не может быть отключен из-за нового «стартового экрана». Поскольку процесс DWM обычно должен работать постоянно в Windows 8, пользователи, испытывающие проблемы с этим процессом, замечают снижение использования памяти после перезагрузки системы. Это часто первый шаг в длинном списке задач по устранению неполадок, которые могут помочь. Можно временно запретить перезапуск DWM в Windows 8, из-за чего рабочий стол становится черным, панель задач серой и нарушается начальный экран/современные приложения, но настольные приложения продолжат работать и выглядеть так же, как базовая тема Windows 7 и Vista, основанная на однобуферном рендерере, используемом XP. Они также используют центрированную строку заголовка Windows 8, видимую в среде предустановки Windows . Запуск Windows без DWM не будет работать, поскольку экран блокировки требует DWM, поэтому это можно сделать только на лету и не имеет никаких практических целей. Начиная с Windows 10, отключение DWM таким образом приведет к поломке всего движка композитинга, даже традиционных настольных приложений, из-за реализаций Universal App на панели задач и в новом меню «Пуск». [ требуется ссылка ] В отличие от своих предшественников, Windows 8 поддерживает базовые видеоадаптеры через Windows Advanced Rasterization Platform (WARP), которая использует программный рендеринг и центральный процессор для рендеринга интерфейса, а не графическую карту. Это позволяет DWM функционировать без совместимых драйверов, но не на том же уровне производительности, что и с обычной графической картой. DWM в Windows 8 также добавляет поддержку стереоскопического 3D . [9]
Для методов рендеринга, которые не поддерживают DWM, вывод должен быть перенаправлен в буферы DWM. В Windows для рендеринга можно использовать как GDI , так и DirectX . Чтобы эти два метода работали с DWM, для обоих предусмотрены методы перенаправления.
С GDI, который является наиболее используемым методом рендеринга пользовательского интерфейса в Microsoft Windows , каждое окно приложения уведомляется, когда оно или его часть попадает в поле зрения, и приложение должно отрисовать себя. Без DWM рендеринг растеризует пользовательский интерфейс в буфере в видеопамяти, откуда он отображается на экране. В DWM вызовы GDI перенаправляются для использования Canonical Display Driver (cdd.dll), программного рендерера. [10] Буфер, равный размеру окна, выделяется в системной памяти, и CDD.DLL выводит данные в этот буфер, а не в видеопамять. Другой буфер выделяется в видеопамяти для представления поверхности DirectX, которая используется в качестве текстуры для сеток окна. Буфер системной памяти преобразуется в поверхность DirectX отдельно и синхронизируется. Этот обходной путь необходим, поскольку GDI не может напрямую выводить данные в формате пикселей DirectX. Поверхность считывается компоновщиком и компонуется на рабочем столе в видеопамяти. Запись вывода GDI в системную память не ускоряется аппаратно, как и преобразование в поверхность DirectX. Когда окно GDI свернуто, невидимо или видимо на том же мониторе, что и полноэкранное приложение DirectX, из-за ограничений GDI буфер растрового изображения GDI больше не принимается приложением при запросе контекста устройства во время рисования или обновления (иногда это можно увидеть, когда операция GDI, копирующая из одного окна в другое, выводит черные или пустые области вместо ожидаемого содержимого окна). Таким образом, DWM использует последнее растровое изображение, отрисованное в буфере перед сворачиванием приложения. [11]
Начиная с Windows 7, драйвер дисплея Canonical больше не выполняет рендеринг в копию системной памяти при наличии видеодрайвера, совместимого с WDDM 1.1/DXGI 1.1.
Для приложений, использующих DirectX для записи на 3D-поверхность, реализация DirectX в Windows Vista использует WDDM для совместного использования поверхности с DWM. Затем DWM напрямую использует поверхность и отображает ее на сетки окон. Для приложений Windows Presentation Foundation (WPF) (которые являются приложениями DirectX) компоновщик выполняет рендеринг на таких общих поверхностях, которые затем компонуются в конечный рабочий стол. [11] Приложения могут смешивать обе техники рендеринга в нескольких дочерних окнах, если только GDI и DirectX не используются для рендеринга одного и того же окна. В этом случае порядок между рендерингом DirectX и GDI не может быть гарантирован, и, как таковой, нельзя гарантировать, что битовая карта GDI из системной памяти была переведена на поверхность видеопамяти. Это означает, что конечная композиция может не содержать элементов, отрисованных GDI. [11] Чтобы предотвратить это, DWM временно отключается, пока запущено приложение, которое смешивает GDI и DirectX в одном окне.
В Windows Vista для DWM требуется совместимое физическое или виртуальное оборудование: [12]
В Windows 7 диспетчер окон рабочего стола был переделан для использования Direct3D 10.1, но требования к оборудованию остались такими же, как в Windows Vista; оборудование Direct3D 9 поддерживается слоем « 10 Level 9 », представленным в среде выполнения Direct3D 11. Windows 8 имеет те же требования, что и 7, но она также может использовать программный рендеринг при отсутствии совместимого видеооборудования. [9]
Программное обеспечение для виртуализации оборудования , эмулирующее необходимое для DWM оборудование, включает VirtualBox 4.1 и более поздние версии, VMware Fusion 3.0 и более поздние версии, а также VMware Workstation 7.0 и более поздние версии. Кроме того, Windows Virtual PC позволяет выполнять композицию с использованием протокола удаленного рабочего стола .
Функциональные возможности разработчика, связанные с диспетчером окон рабочего стола, предоставлены в заголовочном файле dwmapi.h
в составе Windows SDK .