desktop composition что это

IT1102: Современные операционные системы: ОС Windows

Большинство приложений без проблем работают как в Windows ХР, так и в Windows 7. Но вполне может случиться так, что самое важное для вашей деятельности приложение откажется функционировать. Чтобы настроить такое приложение для работы в Windows 7, можно предпринять несколько шагов, начиная с простого автоматического подбора настроек совместимости до запуска приложения в режиме Windows ХР Mode — полностью виртуализованной среде ОС. Важно помнить, что всегда есть способ заставить несовместимое приложение работать на компьютере, использующем Windows 7, хотя для его поиска потребуется некоторое время и усилия.

Система диагностики проблем совместимости

Встроенные режимы и параметры совместимости

В Windows 7 включено несколько встроенных режимов совместимости, позволяющих при помощи ряда параметров частично воспроизводить среду ОС предыдущего поколения. Несмотря на это все-таки возможно, что приложение, исправно функционировавшее в одной из этих ОС, не будет нормально работать даже при использовании соответствующего режима совместимости. Чтобы настроить режим совместимости для приложения, воспользуйтесь вкладкой Совместимость (Compatibility) диалогового окна свойств приложения. Выберите в раскрывающемся списке один из следующих режимов совместимости:

На этой же вкладке размещены и другие параметры совместимости, в частности:

В процессе работы система диагностики пытается применить эти параметры, чтобы заставить приложение работать. Если ей это не удастся, вы сможете настроить их вручную. Нельзя настраивать параметры совместимости приложений, которые входят в состав ОС Windows. Если вам не удается при помощи перечисленных параметров заставить приложение работать, воспользуйтесь пакетом Application Compatibility Toolkit (ACT) для создания собственного режима совместимости, который будет настраиваться более детально для конкретных нужд того приложения, которое вы пытаетесь запустить.

Источник

Настраиваем подключения к удаленному рабочему столу

Архив номеров / 2008 / Выпуск №10 (71) / Настраиваем подключения к удаленному рабочему столу

Иван Коробко

Настраиваем подключения к удаленному рабочему столу

Когда вам необходимо создать несколько удаленных подключений к разным серверам, то рекомендуется создавать RDP-файлы. Именно о них пойдет речь в этой статье.

Организуя работу домена, системный администратор выделяет группу привилегированных пользователей среди прочих. К ним относятся системные администраторы, специалисты системной поддержки. Как правило, такие сотрудники имеют две учетные записи: рядового пользователя, которую используют для ежедневной работы, и запись, наделенную привилегиями. Для краткости изложения назовем ее административной, хотя набор прав административных записей между собой может отличаться.

Управление серверами в крупных сетях осуществляется с помощью терминального сервера. Особенности его настройки выходят за рамки данной статьи.

На рабочей станции для входа на удаленный компьютер необходимо настроить соединение. О том, как автоматизировать этот процесс, пойдет речь в этой статье.

Remote Desktop Protocol

RDP (Remote Desktop Protocol, протокол удалённого рабочего стола) – протокол прикладного уровня, использующийся для создания удаленной работы с компьютером в терминальном режиме. По умолчанию используется порт TCP 3389. В настоящее время используется 6-я версия протокола.

Для создания удаленного обеспечения используется Remote Desktop Connection или Terminal Services Client (TSC). Последнюю версию Remote Desktop Connection можно загрузить с сайта Microsoft: http://download.microsoft.com/download/8/e/8/8e88f947-3b95-49b8-a76d-b647bb86e4b4/MSRDPCLI.EXE.

Подключение к удаленному рабочему столу

Если программа запускается впервые, то список серверов пуст. Для подключения к какому-либо серверу необходимо ввести его имя в поле «Компьютер» (Computer) и нажать клавишу «Ввод» (Enter). В это время в ветви реестра HCKU\Software\Microsoft\Terminal Server Client\Default будет создан строковый параметр MRU0. Его значение – введенное имя сервера.

Каждый новый сервер будет автоматически добавляться в этот список (см. рис. 1) в качестве значений параметра MRU1, MRU2 и т. д.

Рисунок 1. Список серверов с удаленными рабочими столами

При нажатии на кнопку Connect (подключение) будет выведено окно с запросом имени и пароля администратора, с привилегиями которого совершается вход на сервер.

Многие системные администраторы используют именно этот способ подключения к серверам. Он прост и удобен, пока серверов мало. Когда их количество велико, их имена меняются в связи с различными обстоятельствами, то самое разумное в сложившейся ситуации создать несколько файлов конфигурации, воспользовавшись дополнительными параметрами.

RDP-файл – это текстовый файл (см. рис. 2), содержащий настройки подключения к заданному серверу. Для каждого сервера этот файл индивидуален.

Рисунок 2. Фрагмент RDP-файла

По своей структуре любая строка файла состоит из трех частей:

Части строки разделены между собой символом «:» (двоеточие).

Для создания RDP-файла необходимо вывести на экран списки дополнительных параметров, нажав на кнопку «Параметры >>» в правом нижнем углу. В появившейся по умолчанию вкладке «Общие», в разделе «Параметры подключения» нажмите на кнопку «Сохранить» или «Сохранить как…». При нажатии на кнопку «Сохранить» текущая конфигурация мастера будет сохранена в файле Default.rdp в каталоге %UserProfile%\Мои Документы (см. рис. 3). В этом случае создается скрытый файл Default.rdp. Если для сохранения конфигурации используется кнопка «Сохранить как», то пользователю выдается стандартное диалоговое окно, в котором он может изменить имя и путь к файлу. По умолчанию предлагается сохранить файл под именем Default в каталоге %UserProfile%\Мои Документы.

Рисунок 3. Создание RDP-файла

Для коррекции созданного RDP-файла нужно в разделе «Параметры подключения» вкладки «Общие» нажать на кнопку «Открыть…». В появившемся диалоговом окне выберите нужный файл и нажмите «Открыть». Настройки, сохраненные в этом файле, будут перенесены во все параметры, расположенные во вкладках мастера настройки.

Замечание. Часть настроек тесно перекликается с установками в каталоге Active Directory. Разница заключается в том, что настройки, установленные в Active Directory, действительны для указанного пользователя; настройки, установленные мастером, действительны для указанного удаленного компьютера. При этом конфигурация может не зависеть от учетной записи пользователя.

Дополнительные параметры подключения к удаленному рабочему столу

Дополнительные параметры настройки подключения к удаленному рабочему столу для удобства логически разделены на несколько вкладок:

Поскольку многие параметры перекликаются с настройками терминальной сессии пользователя в каталоге Active Directory, то для полного представления картины читателем уделим внимание одноименным параметрам в каталоге Active Directory.

Параметры вкладки «Общие»

Часть функционала, а именно раздел «Параметры подключения», посвященный созданию файла настроек с расширением RDP, была описана в предыдущем разделе. Рассмотрим подробнее оставшуюся вкладку «Параметры входа».

На рис. 4 вместо значений параметров указаны их названия в RDP-файле. Так, имени компьютера в этом файле соответствует параметр full address, а учетному имени пользователя – параметр username (см. листинг 1).

Листинг 1. Фрагмент RDP-файла для вкладки «Общие»

В соответствии с приведенным листингом осуществляется подключение к серверу SUNRISE с помощью учетной записи TESLA в домене ISLAND.

Рисунок 4. Вкладка «Общие»

Параметры вкладки «Экран»

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

Они условно разделены на две группы: «Размер удаленного изображения» и «Цветовая палитра». Также присутствует один параметр вне группы.

В группе «Размер удаленного рабочего стола» задается разрешение экрана удаленно подключаемого рабочего стола. Как ни странно, оно задается тремя параметрами (см. рис. 5):

Рисунок 5. Вкладка «Экран»

Во второй группе параметров – «Цветовая палитра». В выпадающем списке требуется выбрать одну из цветовых палитр.

В RDP-файле параметру session bpp присваивается одно из следующих значений:

Отдельно вынесено управление отображением панели подключений при работе в полноэкранном режиме. По умолчанию эта опция активна, при этом параметр displayconnectionbar = 1.

В листинге 2 приведен фрагмент RDP-файла, касающийся управления вкладкой «Экран». В нем установлено максимальное экранное разрешение (1600х1200) для удаленного рабочего стола с глубиной цвета 24 бита. При этом отображение панели подключений при работе в полноэкранном режиме выключено.

Листинг 2. Фрагмент RDP-файла для вкладки «Экран»

Параметры вкладки «Локальные ресурсы»

В этой вкладке (см. рис. 6) настраиваются правила подключения локальных ресурсов данной рабочей станции к удаленному рабочему столу. Настраивается возможность печати с удаленного ресурса, управление звуком, определяются правила работы с клавиатурой и т. д. Управление основными ресурсами находится во вкладке, доступ к второстепенным осуществляется нажатием на кнопку «Подробнее…».

Рисунок 6. Вкладка «Локальные ресурсы»

К основным ресурсам относятся:

Управление звуком на удаленном компьютере

Настройка управления звуком осуществляется выбором одного из трех доступных в списке режимов. В RDP-файле за это отвечает параметр audiomode, принимающий одно из трех возможных значений (см. таблицу 1).

Таблица 1. Настройка звука на удаленном компьютере

Значение параметра audiomode

Перенести на этот компьютер

Оставить на удаленном компьютере

Управление сочетанием клавиш Windows

Многие администраторы для удобства работы используют клавиатурные сокращения. Правила использования клавиатурных сокращений на удаленном рабочем столе определяется в разделе «Использование сочетаний клавиш Windows». Сделанные настройки сохраняются в RDP-файле в качестве одного из значений параметра keyboardhook (см. таблицу 2).

Таблица 2. Настройка использования сочетаний клавиш Windows

Значение параметра audiomode

На локальном компьютере

На удаленном компьютере

Только в полноэкранном режиме

Настройка локальных устройств

Настройка локальных устройств, пожалуй, самый объемный раздел из всех присутствующих на этой вкладке. Управление подключением принтеров (redirectprinters = 0 | 1) и буфера обмена (redirectclipboard = 0 | 1) находятся на этой вкладке. Оба параметра по умолчанию активированы, то есть значение параметров равно единице.

Для доступа к остальным вкладкам необходимо нажать на кнопку «Подробнее…» (см. рис. 6).

В появившемся окне присутствуют две группы параметров: смарт-карты и последовательные порты.

Управление смарт-картами по умолчанию активировано параметром redirectsmartcard = 1. Параметр redirectsmartcard принимает одно из двух значений: 0 или 1.

Вторая группа (поддерживаемые устройства) параметров условно разделена на две части:

За состояние группы отвечает параметр redirectcomports, принимающий значение 0 или 1. По умолчанию redirectcomports = 0.

За конфигурацию выбранных устройств отвечает параметр drivestoreredirect. По умолчанию этот параметр присутствует в RDP-файле и имеет пустое значение. При выборе всех устройств он принимает значение «*» (звездочка). Если выделены конкретные устройства, то они перечисляются через запятую (см. листинг 3).

Листинг 3. Фрагмент RDP-файла для вкладки «Экран»

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

В листинге 3 приведен пример конфигурации локальных ресурсов со следующими значениями:

Параметры вкладки «Программы»

Аналогично настройкам терминальной сессии в каталоге Active Directory во время подключения к удаленному рабочему столу можно обеспечить запуск указанной программы (см. рис. 7).

Рисунок 7. Вкладка «Программы»

Для этого необходимо задать полный путь к запускаемому файлу (параметр alternate shell) и указать рабочую папку (параметр shell working directory). По умолчанию ни один из этих параметров не задан: remoteapplicationmode = 0, а остальным двум параметрам присвоены «пустые» значения (см. листинг 4).

Листинг 4. Фрагмент RDP-файла для вкладки «Программы»

shell working directory:s:

Параметры вкладки «Дополнительно»

В этой вкладке (см. рис. 8) сосредоточены дополнительные параметры управления рабочим столом, которые зависят от скорости соединения. На выбор предлагается несколько вариантов настройки (см. таблицу 3). Каждому приведенному из семи параметров в RDP-файле соответствует параметр, принимающий флаговое значение (TRUE / FALSE). По умолчанию выбран набор «Модем 56 Кбит/с». Кроме того, отдельно вынесен параметр управления восстановлением подключения при разрыве связи. По умолчанию эта функция активирована (autoreconnection enabled = 1).

Таблица 3. Наборы дополнительных возможностей

Параметр в RDP-файле

Высокоскоростное
(128 Кбит/с – 1,5 Кбит/с)

Источник

Что такое Desktop Window Manager?

В разделе статей «Система» вы можете найти большую статью о WGF (DirectX9L), WGF2 (DirectX10), WDDM (Windows Display Driver Model), WPF (Avalon, Windows Presentation Foundation) и DWM (Desktop Window Manager). Но та статья довольно профессиональная и то и время сверкает техническими терминами. Поэтому я подумал, что отдельная небольшая заметка (а вернее перевод заметки) от разработчиков DWM нашему проекту вовсе не помешает. Итак, что такое DWM? Говорит Грек Чештер, работник Microsoft.

21 месяц назад я написал одну внушительную статью и после этого молчал. Что я делал все это Время? Конечно, я разрабатывал Desktop Window Manager (DWM) для Windows Vista! DWM – одно из наиболее видимых возможностей Vista.
Но значит ли это, что я бросил команду разработчиков WPF (Avalon)? Ни в коем случае! DWM полностью построен на Avalon и развивается той же командой.

Последнее время мы интенсивно работали, но теперь начинаем подходить к завершению проекта и я решил передохнуть и вкратце рассказать, чего мы добились. Есть множество аспектов того, что может быть обсуждено на тему DWM, поэтому здесь – только общий взгляд на технологию.

Публичное лицо DWM
DWM – лишь часть Vista, и идет как бы в составе всех новых графических технологий, объединенных конечным Windows Aero. Ниже я разместил некоторые из конечных проявлений DWM и Aero Glass.

— Aero Glass – новый полупрозрачный интерфейс, легко узнаваемый, с эффектом blur на фоне, чтобы взгляд концентрировался только на текущем окне.

— Живые превью на таскбаре при наведении на него мышкой.

— И вот Flip и Flip 3D – новые способы перемещения между окнами доступные через сочетания клавиш alt-tab и win-tab.

Во всех предыдущих версиях Windows, плоть до ХР, приложение просило отобразить что-то у Windows, это передавалось в буфер и должно было быть отображено видеокартой. В Vista приложения просят Windows отобразить их отдельные части на разных «слоях» экрана, затем это пересылается DWM, который создает единую картину и отображает ее.

Это очень важно, так как это позволяет многое реализовать по новой с лучшим качеством. Некоторый примеры:
— Доступ к окнам, осуществляющийся по новой технологии, может быть использован в других местах. Например, в том же Flip или Flip 3D или в ваших собственных приложениях.
— Не вовлекаются второстепенные окна, так как рендеринг происходит на разных «слоях»; так больше не будет проблем с тем, что приложение не успело достаточно быстро «перекраситься» (вследствие зависания или даже без него) и остались следы, как это было скажем в ХР, в особенности в Internet Explorer 7:

В обоих этих случаях, IE было неспособно «перекрасить» себя достаточно быстро, чтобы избежать «следов», которое оставило за собой перемещающееся окно.

В Vista такое невозможно, так как все окна располагаются в разных «слоях» и не взаимосвязаны таким образом между собой.

— Больше возможностей. DWM проводит к экрану все что угодно, вплоть до DirectX, ранее использовавшегося только в играх; теперь его возможно использовать в обычных приложениях. DWM также увеличивает качество такого использования, так как все окна располагаются на разных «слоях» и DirectX в одном из них никак не повлияет на остальные.

— Поддержка больших разрешений. Сегодня большие разрешения не используются из-за того, что все объекты кажутся слишком маленькими физически. DWM позволяет масштабировать DPI на экране для достижения нужного эффекта на больших разрешения (120 DPI, 144 DPI и т.д.).

Возможные будущие темы

Источник

What Is Desktop Composition – How To Enable Or Disable It?

What is Desktop composition you ask? Well, Desktop composition is a visual experience feature, which was first introduced in Vista. This feature has completely changed the way pixels are displayed on the screen by the different applications. In this article we will discuss what desktop composition is and how to enable or disable them.

Also, check out this article on how to calibrate laptop screen on Windows 10.

What Is Desktop Composition?

So what is desktop composition, and what it means to have it enabled? Having the desktop composition enabled means that individual windows will not draw to the primary display directly as it was used to happen in earlier Windows.

The drawing of the screen is actually redirected to the off-screen surfaces in video memory. This drawing is then rendered as a desktop image and presented for us on the display.

The Desktop Window Manager (DWM) is the service behind the Desktop composition. This DWM service then enables the visual effects and the features like the Aero theme on the desktop using the Desktop composition.

How To Enable Desktop Composition?

There are a few ways you can enable the Desktop Composition in Windows 7 and Vista, which are given below. Read them carefully and you will know how to enable desktop composition.

Method 1: Enable Through The Visual Effects Settings

The first method is to enable from the Visual effects settings. Follow the steps given below to do it:

Similarly, disable desktop composition by unchecking that box.

Method 2: Enable From Services

The second method to enable it is through the Services. Follow the steps given below to do it:

Changing the Startup type to Disable will disable it.

Method 3: Enable Through Registry Editor

In the 3 rd method, you will have to manually enable it through the Registry Editor. To do it, follow the steps given below:

Enter the value 1 if you want to disable it.

Method 4: Enable From The Local Group Policy Editor

In the 4 th method, you will have to use the Local Group Policy Editor. To do it, follow the steps given below:

Restart the computer and the desktop composition will be enabled. To disable it, select the enabled option.

How To Disable Desktop Composition In Windows 10?

The most asked questions online about Desktop composition is if it can be disabled in Windows 10. Well, there is no setting that you can use to disable Desktop Composition in Windows 10. Neither one can disable the DWM from the methods that work in Windows 7 and Vista.

From Windows 8, Microsoft has removed the ability to disable desktop composition. However, there is a way you can force close it, although we don’t recommend you trying it as many mishaps can occur trying to disable a Windows service that isn’t supposed to be disabled in Windows 10.

Steps To Disable Desktop Composition

To disable Desktop Composition in Windows 10, follow the steps given below:

Now, if you want the DWM back, then you will just have to resume the winlogon.exe from the Resource monitor.

This method of disabling the Desktop composition in Windows 10 may or may not work for you. However, this method did work for us.

Wrapping Up

So, now you have the answer to “What is Desktop composition?” and also how you can enable/disable it in Windows 7 and Vista and also how to disable desktop composition in Windows 10. Follow the above steps very carefully, and we again recommend you not to try disabling the desktop composition in Windows 10. Leave your comments below in the comment section sharing your views on this article.

About Sanmay Chakrabarti

Sanmay is a natural geek and love to write about technology. He loves to travel when free and enjoy playing his new PS4.

Comments

I still don’t get what “desktop composition” means for the visual experience of the user, and if it takes more or less computer resources etc.

Источник

В этой статье рассматривается предварительная версия программного обеспечения. Любая изложенная здесь информация может быть изменена.

Продукты и технологии:
Windows Composition, Windows Runtime, Desktop Window Manager, DirectComposition, Direct2D В статье рассматриваются:

Механизм композиции Windows (composition engine), иначе известный как Desktop Window Manager (DWM), получил новый API для Windows 10. Ранее основным интерфейсом композиции был DirectComposition, но, как классический COM API, он был по большей части недоступен среднему разработчику приложений. Новый API композиции Windows опирается на Windows Runtime (WinRT) и предоставляет основы для высокопроизводительного рендеринга, сочетая в себе графику прямого режима (immediate-mode graphics), поддерживаемую Direct2D и Direct3D, с сохраненным деревом визуальных элементов, которое теперь обеспечивает намного улучшенные анимацию и эффекты.

Впервые я писал о DWM в 2006 году, когда Windows Vista еще была на стадии бета-версии (goo.gl/19jCyR). Он позволял вам управлять степенью эффекта размывания для данного окна и создавать пользовательских «хром», который красиво смешивался с рабочим столом. Рис. 1 иллюстрирует высоту этого достижения в Windows 7. Благодаря аппаратно ускоряемому рендерингу с помощью Direct3D и Direct2D можно было создавать сногсшибательные визуальные элементы для вашего приложения (goo.gl/IufcN1). Вы могли даже смешивать старый мир GDI и USER-элементов управления с DWM (goo.gl/9ITISE). Тем не менее, любой внимательный наблюдатель мог бы сказать, что DWM способен на гораздо большее. Функциональность Windows Flip 3D в Windows 7 была убедительным доказательством этого.


Рис. 1. Windows Aero

В Windows 8 ввели новый API для DWM — DirectComposition, имя которого отдает должное DirectX-семейству классических COM API, которые вдохновили проектировщиков на эту архитектуру. DirectComposition начал давать разработчикам более четкую картину того, на что был способен DWM. Кроме того, он предложил улучшенную терминологию. DWM на самом деле является механизмом композиции Windows, и он позволял создавать сногсшибательные эффекты в Windows Vista и Windows 7, так как он фундаментальным образом изменил то, как выполнялся рендеринг окон рабочего стола. По умолчанию механизм композиции создавал поверхность переадресации (redirection surface) для каждого окна верхнего уровня. Я подробно описывал это в своей рубрике за июнь 2014 года (goo.gl/oMlVa4). Эти поверхности образовывали часть дерева визуальных элементов (visual tree), и DirectComposition позволял приложениям пользоваться той же технологией, предоставляя облегченный API режима сохранения (retained-mode API) для высокопроизводительной графики. DirectComposition предлагал управление деревом визуальных элементов и поверхностями, что давало возможность приложению перекладывать создание эффектов и анимаций на механизм композиции. Я описывал эти возможности в своей рубрике за август (goo.gl/CNwnWR) и сентябрь 2014 года (goo.gl/y7ZMLL). Я даже подготовил учебный курс для Pluralsight по высокопроизводительному рендерингу с помощью DirectComposition (goo.gl/fgg0XN).

Windows 8 дебютировала с DirectComposition наряду с впечатляющими усовершенствованиями в остальной части DirectX-семейства API, а также провозгласила новую эру для Windows API, который навсегда изменит то, как разработчики рассматривают операционную систему (ОС). Введение Windows Runtime затмило все остальное. Microsoft обещала совершенно новый способ создания приложений и доступа к сервисам ОС, который знаменовал постепенный уход так называемого Win32 API, столь давно доминировавшего в создании приложений и взаимодействии с ОС. Windows 8 резво взяла старт с большими огрехами, но в Windows 8.1 исправили массу проблем, и теперь Windows 10 предоставляет куда более обширный API, который удовлетворит намного больше разработчиков, заинтересованных в создании первоклассных, я бы даже сказал, серьезных приложений для Windows.

Поставки Windows 10 начались в июле 2015 года с предварительной версией нового API композиции, который еще не был готов к полноценному использованию. Он по-прежнему может быть изменен, а значит, его нельзя применять в универсальных Windows-приложениях, передаваемых в Windows Store. Это только к лучшему, потому что API композиции, который теперь доступен для производственной эксплуатации, значительно изменился, причем в лучшую сторону. Это обновление Windows 10 также является первым случаем, когда один и тот же API композиции доступен на устройствах всех форм-факторов, укрепляя уверенность в универсальности платформы Universal Windows Platform (UWP). Композиция работает одинаково независимо от того, ориентируетесь вы на настольный компьютер с несколькими мониторами или на маленький смартфон.

API композиции Windows дистанцируется от своих корней в DirectX. Хотя DirectComposition предоставлял объект device, смоделированный по образцу Direct3D- и Direct2D-устройств, новый API композиции Windows начинает с компоновщика (compositor). Однако он служит той же цели, действуя как фабрика для ресурсов композиции. В остальном API композиции Windows очень похож на DirectComposition. Есть мишень композиции (composition target), которая представляет связь между окном и его деревом визуальных элементов. Разница становится более явной, когда вы внимательнее смотрите на визуальные элементы (визуалы). Визуал в DirectComposition имел свойство content, которое предоставляло ту или иную битовую карту. Битовая карта выступала в одной из трех ролей: поверхности композиции (composition surface), DXGI-цепочки обмена (swap chain) или поверхности переадресации другого окна. Типичное DirectComposition-приложение состояло из визуалов и поверхностей, причем поверхности работали как контент или битовые карты для различных визуалов. Как показано на рис. 2, дерево визуальных элементов композиции — штука несколько другая. Новый объект visual не имеет свойства content, и его рендеринг выполняется кистью композиции. Как оказалось, это более гибкая абстракция. Хотя кисть может просто визуализировать битовую карту, как и раньше, простые кисти сплошного цвета можно создавать очень эффективно; кроме того, возможно определение более сложных кистей, по крайней мере концептуально, в почти таком же стиле, как Direct2D предоставляет эффекты, которые можно обрабатывать как изображения. Вся разница в подходящей абстракции.


Рис. 2. Дерево визуальных элементов композиции Windows

Рубрика: Администрирование / Продукты и решения
Target Мишень
Visual Визуальный элемент
Brush Кисть

Давайте рассмотрим некоторые практические примеры, чтобы увидеть, как все это работает, и дать вам представление о том, что возможно. И вновь вы можете выбрать свою любимую языковую проекцию WinRT. На современном C++ компоновщик создается так:

Аналогично то же самое можно сделать на C#:

Вы даже можете использовать более колоритный синтаксис, предлагаемый C++/CX:

Все это эквиваленты с точки зрения API и простое отражение различий в языковых проекциях. Сегодня вы можете писать UWP-приложения в основном двумя способами. По-видимому, самый распространенный подход — использование пространства имен Windows.UI.Xaml в ОС. Если XAML не особо важен в вашем приложении, вы также можете использовать нижележащую модель приложений напрямую безо всякой зависимости от XAML. Я описывал модель WinRT-приложений в своей рубрике за август 2013 года (goo.gl/GI3OKP). Применяя этот подход, вам просто нужна минимальная реализация интерфейсов IFrameworkView и IFrameworkViewSource, после чего вы готовы к дальнейшей работе. На рис. 3 дан базовый каркасный код на C#, который вы можете использовать для начала. Композиция Windows также предлагает глубокую интеграцию с XAML, но давайте начнем с простого приложения без XAML — так будет легче понять композицию. Я вернусь к XAML в этой статье несколько позже.

Рис. 3. Модель приложения Windows Runtime на C#

Компоновщик должен конструироваться в методе SetWindow объекта приложения (рис. 3). По сути, это самая ранняя точка в жизненном цикле приложения, где это возможно, так как компоновщик зависит от диспетчера окна, а это та самая точка, в которой окно и диспетчер начинают свое существование. Связь между компоновщиком и представлением приложения может быть после этого установлена созданием мишени композиции:

Важно, чтобы приложение поддерживало существование мишени композиции, поэтому вы должны сделать ее переменной-членом вашей реализации IFrameworkView. Как упоминалось ранее, мишень композиции представляет связь между окном или представлением и его деревом визуальных элементов. Все, что вы можете сделать с мишенью композиции, — задать корневой визуальный элемент. Как правило, им будет визуал контейнера:

Здесь я использую C++, в котором недостает языковой поддержки свойств, поэтому свойство Root проецируется как методы-аксессоры. Код на C# очень похож, но добавляется синтаксис свойств:

DirectComposition предоставлял только один вид визуала, который поддерживал разные виды поверхностей для представления контента битовой карты. Windows-композиция предлагает небольшую иерархию классов, которая представляет разные виды визуалов, кистей и анимаций, тем не менее есть только один вид поверхности, и ее можно создать лишь на C++, потому что он является частью Interop API Windows-композиции, предназначенного для использования инфраструктурами вроде XAML и разработчиками более изощренных приложений.

Иерархия визуальных классов показана на рис. 4. CompositionObject — это ресурс, поддерживаемый компоновщиком (compositor). Все объекты композиции потенциально иметь анимируемые свойства. Visual предоставляет уйму свойств для управления многими аспектами относительной позиции, внешнего вида, параметров отсечения и рендеринга визуала. Он включает свойство матричного преобразования, а также сокращения для масштабирования и поворачивания. Это мощный базовый класс. ContainerVisual, напротив, является сравнительно простым классом, который лишь добавляет свойство Children. Хотя вы можете создавать визуалы контейнера напрямую, SpriteVisual добавляет возможность сопоставлять кисть, чтобы визуальный элемент мог сам выполнять рендеринг своих пикселей.


Рис. 4. Визуалы композиции

Для корневого визуала контейнера можно создать любое количество дочерних визуалов:

Они тоже могут быть визуалами контейнера, но более вероятно, что они станут спрайтовыми визуалами (sprite visuals). Я мог бы добавить три визуальных элемента как дочерние корневого визуала, используя цикл for в C++:

Можно легко вообразить окно приложения на рис. 5, тем не менее этот код не приведет к рендерингу чего бы то ни было, поскольку с этими визуалами не сопоставлена кисть. Иерархия классов кистей представлена на рис. 6. CompositionBrush — это просто базовый класс для кистей, он не предоставляет никакой собственной функциональности. CompositionColorBrush — простейший производный класс, предлагающий только свойство color для рендеринга визуалов сплошным цветом. Возможно, это звучит не слишком захватывающе, но не забудьте, что к этому свойству можно подключать анимации. Классы CompositionEffectBrush и CompositionSurfaceBrush взаимосвязаны, но это более сложные кисти, так как они поддерживаются другими ресурсами. CompositionSurfaceBrush будет выполнять рендеринг поверхности композиции для любых подключенных визуалов. У него множество свойств, управляющих рисованием битовой карты, например интерполяцией, выравниванием, растягиванием, не говоря уже об операциях с самой поверхностью. CompositionEffectBrush принимает ряд кистей поверхности, создавая разнообразные эффекты.


Рис. 5. Дочерние визуалы в окне


Рис. 6. Кисти композиции

Создание и применение цветной кисти — достаточно прямолинейная процедура. Вот пример на C#:

Создать объект анимации и потом применить эту анимацию к конкретному объекту композиции на удивление легко.

Структура Color предоставляется пространством имен Windows.UI и поддерживает альфа-канал, красный, зеленый и синий как 8-битовые значения цветов, что является отходом от предпочтения значений с плавающей точкой в DirectComposition и Direct2D. Удобство этого подхода к визуалам и кистям в том, что свойство цвета можно изменить в любой момент и любые визуалы, ссылающиеся на ту же кисть, будут автоматически обновлены. Кроме того, как я уже намекал, свойство Color можно даже анимировать. Как же это работает? Ответ на этот вопрос приводит нас к классам анимации.

Иерархия классов анимации показана на рис. 7. Базовый класс CompositionAnimation предоставляет возможность сохранять именованные значения для использования в выражениях. Подробнее о выражениях я расскажу чуть позже. KeyFrameAnimation предоставляет типичные свойства анимации по ключевым кадрам (keyframe-based) вроде длительности, итерации и поведения окончания (stop behavior). Разные классы анимации по ключевым кадрам предлагают специфичные для типа методы вставки ключевых кадров, а также специфичные для типа свойства анимации. Например, ColorKeyFrameAnimation позволяет вставлять ключевые кадры с цветовыми значениями и управлять цветовым пространством для интерполяции между ключевыми кадрами.


Рис. 7. Анимации композиции

Создать объект анимации и потом применить эту анимацию к конкретному объекту композиции на удивление легко. Допустим, я хочу анимировать прозрачность визуального элемента. Я мог бы задать прозрачность этого визуала равной 50% прямо в скалярном значении на C++:

В качестве альтернативы можно создать объект скалярной анимации с ключевыми кадрами для получения переменной animation со значениями от 0.0 до 1.0, представляющими 0–100% прозрачности:

Первый параметр InsertKeyFrame — относительное смещение от начала анимации (0.0) к ее концу (1.0). Второй параметр — это значение переменной animation в этой точке анимационной последовательности. Поэтому данная анимация будет плавно изменять значение от 0.0 до 1.0 в течение длительности анимации. Затем можно указать общую длительность этой анимации:

Подготовив анимацию, достаточно подключить ее к объекту композиции и свойству на выбор:

Метод StartAnimation на самом деле наследуется от базового класса CompositionObject, а значит, вы можете анимировать свойства множества различных классов. Это еще один отход от DirectComposition, где каждое анимируемое свойство предоставляло перегрузки для скалярных значений, а также объекты анимации. Windows-композиция предлагает гораздо более богатую систему свойств, которая открывает некоторые очень интересные возможности. В частности, она поддерживает возможность написания текстовых выражений, сокращающих количество кода, необходимого для более интересных анимаций и эффектов. Эти выражения разбираются в период выполнения, компилируются, а затем эффективно исполняются механизмом композиции в Windows.

Вообразите, что вам нужно поворачивать визуальный элемент по оси Y и придать глубину его внешнему виду. Свойства RotationAngle визуального элемента, измеряемого в радианах, недостаточно, потому что оно не создаст преобразование, которое включает перспективу. По мере поворачивания визуала край, ближайший к человеческому глазу, должен выглядеть крупнее, а противоположный край — меньшим. На рис. 8 показан ряд вращающихся визуальных элементов, иллюстрирующих это поведение.


Рис. 8. Вращение визуалов

Как вы могли бы реализовать такой анимированный эффект? Что ж, давайте начнем со скалярной анимации по ключевым кадрам для угла поворота:

Функция линейной плавности (linear easing function) переопределяет исходную функцию ускорения/замедления для создания непрерывного вращения. Затем нужно определить пользовательский объект со свойством, на которое можно ссылаться из выражения. Компоновщик предоставляет набор свойств как раз для этой цели:

Набор свойств также является объектом композиции, поэтому можно использовать метод StartAnimation, чтобы анимировать пользовательское свойство так же легко, как любое встроенное:

WinRT-классы могут реализовать дополнительные COM-интерфейсы, не видимые напрямую, если у вас есть лишь метаданные компонента в Windows.

Теперь у меня есть объект, чье свойство Angle «находится в движении». Далее нужно определить матрицу преобразования для создания требуемого эффекта, в то же время делегируя его этому анимированному свойству для самого угла поворота. Знакомьтесь с выражениями (expressions):

Анимация на основе выражения (expression animation) не является объектом анимации по ключевым кадрам, поэтому здесь нет относительных смещений по ключевым кадрам, на которые могли бы изменяться переменные, управляющие анимацией (с применением какой-либо функции интерполяции). Вместо этого выражения просто ссылаются на параметры, которые сами могут анимироваться в более традиционном смысле. Тем не менее, обязанность определения того, что такое «pre», «axis», «rotation» и «post», лежит на мне. Начнем с параметра axis:

Метод CreateFromAxisAngle внутри выражения ожидает поворачивания оси, и это определяет ось вокруг оси Y. Он также ожидает передачи угла поворота и в этом мы можем положиться на набор свойств rotation с его анимируемым свойством Angle:

Чтобы гарантировать поворачивание по центру визуального элемента, а не по левому краю, нужно заранее перемножить матрицу вращения, созданную CreateFromAxisAngle, с матрицей трансляции, которая логически смещает ось в точку вращения:

Вспомните, что перемножение матриц не является перестановочным (commutative), поэтому матрицы pre и post действительно таковы, как есть. Наконец, после матрицы вращения можно добавить некоторую перспективу, а затем восстановить визуальный элемент в его исходном местоположении:

Это удовлетворяет все параметры, на которые ссылается выражение, и теперь можно просто использовать анимацию на основе выражения, чтобы анимировать визуал, используя его свойство TransformMatrix:

На данный момент я исследовал разнообразные способы создания, заполнения и анимации визуальных элементов, но как быть, если мне потребуется выполнять рендеринг визуалов напрямую? DirectComposition предлагал как предварительно выделенные поверхности (preallocated surfaces), так и разреженные битовые карты (sparsely allocated bitmaps), называемые виртуальными поверхностями, которые выделялись по запросу и были масштабируемыми. Windows-композиция, на первый взгляд, вообще не позволяет создавать поверхности. Есть класс CompositionDrawingSurface, но нет способа создать его без помощи извне. Ответ кроется в Interop API механизма композиции Windows. WinRT-классы могут реализовать дополнительные COM-интерфейсы, не видимые напрямую, если у вас есть лишь метаданные компонента в Windows. Зная об этих замаскированных интерфейсах, можно легко запросить их на C++. Естественно, это потребует несколько больше работы, когда вы шагнете за границы изящных абстракций, предоставляемых рядовым разработчикам через API композиции Windows. Так что первым делом мне нужно создать устройство рендеринга и использовать Direct3D 11, поскольку Windows-композиция пока не поддерживает Direct3D 12:

Затем я установлю флаги создания устройства:

Поддержка BGRA позволяет использовать более доступный Direct2D API для рендеринга с помощью этого устройства, а затем функция D3D11CreateDevice создает само аппаратное устройство:

Далее нужно запросить DXGI-интерфейс устройства, так как это требуется для создания Direct2D-устройства:

Теперь пора создать само Direct2D-устройство:

Здесь я вновь разрешу применение отладочного уровня для дополнительной диагностики:

Я мог бы сначала создать Direct2D-фабрику для создания устройства. Это было бы полезно, если бы я хотел создать аппаратно-независимые ресурсы. Здесь я просто использую сокращение, предоставляемое функцией D2D1CreateDevice:

Поскольку CompositionGraphicsDevice является WinRT-типом, вновь можно использовать современный C++.

Устройство рендеринга готово. У меня имеется Direct2D-устройство, которое можно использовать для рендеринга чего угодно. Теперь я должен сообщить механизму композиции Windows об этом устройстве. И здесь в игру вступают те самые замаскированные интерфейсы. Располагая компоновщиком, который я постоянно применял, я могу запросить интерфейс ICompositorInterop:

ICompositorInterop предоставляет методы для создания поверхности композиции из DXGI-поверхности, что определенно было бы удобно, если бы я хотел включить существующую цепочку обмена в дерево визуальных элементов композиции. Но он содержит кое-что еще, куда более интересное. Его метод CreateGraphicsDevice создаст объект CompositionGraphicsDevice для данного устройства рендеринга. CompositionGraphicsDevice является обычным классом в API композиции Windows, а не замаскированным интерфейсом, но у него нет конструктора, поэтому придется создать его с помощью C++ и интерфейса ICompositorInterop:

Поскольку CompositionGraphicsDevice является WinRT-типом, вновь можно использовать современный C++, а не указатели и ручную обработку ошибок. И именно CompositionGraphicsDevice наконец-то позволяет мне создать поверхность композиции:

Здесь я создаю поверхность композиции размером 100 × 100 пикселей. Заметьте, что это физические пиксели, а не логические координаты с поддержкой DPI, предполагаемые и предоставляемые в остальной части Windows-композиции. Поверхность также обеспечивает рендеринг со смешиванием по 32-разрядному альфа-каналу, поддерживаемый Direct2D. Конечно, Direct3D и Direct2D пока не предоставляются через Windows Runtime, поэтому для рисования на этой поверхности придется вернуться к замаскированным интерфейсам:

Во многом аналогично DirectComposition механизм композиции Windows поддерживает методы BeginDraw и EndDraw в интерфейсе ICompositionDrawingSurfaceInterop, которые заменяют типичные вызовы Direct2D-методов под теми же именами:

Windows-композиция принимает исходное устройство рендеринга, переданное в момент создания устройства композиции, и на его основе создает контекст устройства или мишень рендеринга. При желании я могу передать отсекающий прямоугольник с размерами в физических пикселях, но здесь я просто выбираю неограниченный доступ к поверхности рендеринга. BeginDraw также возвращает смещение (вновь в физических пикселях), в том числе начало координат предполагаемой поверхности рисования. Оно не обязательно находится в левом верхнем углу мишени рендеринга, поэтому нужно позаботиться о подстройке или преобразовании любых команд рисования для корректного использования этого смещения. И вновь не вызывайте BeginDraw применительно к мишени рендеринга, поскольку механизм композиции Windows уже сделал это за вас. Эта мишень логически принадлежит API композиции, и следует быть осторожным, чтобы не удерживать ее после вызова EndDraw. Теперь мишень рендеринга готова, но не осведомлена о логическом или эффективном DPI для представления. Я могу использовать пространство имен Windows::Graphics::Display, чтобы получить логический DPI для текущего представления и задать DPI, который будет применяться Direct2D при рендеринге:

Заключительный этап перед тем, как может начаться рендеринг, — та или иная обработка смещения в композиции. Одно из простых решений в том, чтобы использовать это смещение для создания матрицы преобразования. Вспомните, что Direct2D оперирует логическими пикселями, а значит, я должен использовать не только смещение, но и недавно заданное значение DPI:

К этому моменту вы можете рисовать что угодно до вызова метода EndDraw применительно к interop-интерфейсу поверхности, чтобы быть уверенным в том, что любые пакеты Direct2D-команд рисования обрабатываются и изменения на поверхности отражаются в дереве визуальных элементов композиции:

Конечно, я пока не сопоставил эту поверхность с визуальным элементом и, как упоминал ранее, у визуалов больше нет свойства content, а потому их рендеринг должен выполняться с помощью кисти. К счастью, компоновщик создаст кисть, представляющую уже подготовленную поверхность:

Затем можно создать обычную спрайтовую кисть и использовать ее для того, что вытащить визуальный элемент на свет божий:

Если вам по-прежнему недостаточно возможностей взаимодействия, вы можете даже взять XAML-элемент и получить нижележащий визуальный элемент композиции. Вот пример на C#:

Несмотря на кажущийся временный статус, ElementCompositionPreview на самом деле готов к коммерческому использованию и может быть задействован в приложениях, передаваемых в Windows Store. Для любого UI-элемента статический метод GetElementVisual вернет визуальный элемент из нижележащего дерева визуальных элементов композиции. Заметьте, что он возвращает Visual, а не ContainerVisual или SpriteVisual, поэтому работать напрямую с дочерними визуальными элементами или применять кисть нельзя, но можно настраивать многие свойства визуальных элементов, предлагаемые Windows-композицией. Вспомогательный класс ElementCompositionPreview содержит некоторые дополнительные статические методы для добавления дочерних визуальных элементов под вашим контролем. Вы можете изменять смещение визуала и операции вроде проверки на попадание курсора в те или иные части UI (hit testing) по-прежнему будут работать на уровне XAML. Вы можете даже применять анимацию напрямую в Windows-композиции, не разрушая инфраструктуру XAML, которая опирается на нее. Давайте создадим простую скалярную анимацию для поворота кнопки. Мне нужно получить компоновщик от визуального элемента, а затем создать объект анимации, как и раньше:

Сформируем простую анимацию для медленного вечного вращения кнопки с применением функции линейной плавности:

Затем я указываю, что один полный поворот должен занимать три секунды, а вращение — продолжаться вечно:

Наконец, я просто соединяя анимацию с визуальным элементом, предоставленным XAML, указывая механизму композиции анимировать его свойство RotationAngle:

Хотя вы, возможно, сумеете вытянуть это из одного XAML, механизм композиции Windows предоставляет гораздо большую мощь и гибкость, учитывая, что он располагается на куда более низком уровне абстракции и, несомненно, обеспечивает более высокую производительность. Как еще один пример, Windows-композиция предоставляет кватернионные анимации (quaternion animations), в настоящее время не поддерживаемые XAML.

Говорить о механизме композиции Windows можно и нужно гораздо дольше и подробнее. По моему скромному мнению, на сегодняшний день это самый прорывной WinRT API.

Говорить о механизме композиции Windows можно и нужно гораздо дольше и подробнее. По моему скромному мнению, на сегодняшний день это самый прорывной WinRT API. Уровень его мощи просто ошеломляет, и в отличие от столь многих крупных API для UI и графики он не требует жертвовать производительностью и даже чрезмерно длительного освоения. Во многих отношениях Windows-композиция является наиболее репрезентативной среди всего того, что есть хорошего и интересного на платформе Windows.

Следите за заметками группы Windows Composition в Twitter: @WinComposition.

Кенни Керр (Kenny Kerr)— высококвалифицированный программист. Живет в Канаде. Автор учебных курсов для Pluralsight, обладатель звания Microsoft MVP. Ведет блог kennykerr.ca. Кроме того, читайте его заметки в twitter.com/kennykerr.

Выражаю благодарность за рецензирование статьи экспертам Microsoft Марку Элдэму (Mark Aldham), Джеймсу Кларку (James Clarke), Джону Серна (John Serna), Джеффри Столлу (Jeffrey Stall) и Нику Уоггонеру (Nick Waggoner).

Источник

Читайте также:  что делать если включается самодиагностика хамачи
Сказочный портал