Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Заметка
Для приложений в Windows 10 рекомендуется использовать API-интерфейсы Windows.UI.Composition вместо DirectComposition. Дополнительные сведения см. в модернизации классического приложения с помощьювизуального слоя.
В этом разделе описываются компоненты, составляющие Microsoft DirectComposition. Он состоит из следующих разделов.
Компоненты программного обеспечения
DirectComposition состоит из следующих основных компонентов программного обеспечения.
- Библиотека приложений в режиме пользователя (dcomp.dll), реализующая общедоступный API на основе компонента (COM).
- Подсистема композиции в пользовательском режиме (dwmcore.dll), размещенная в процессе диспетчера окон рабочего стола (DWM) (dwm.exe), и выполняет фактическую композицию рабочего стола.
- База данных объектов в режиме ядра (часть win32k.sys), которая маршалирует команды из приложения в подсистему композиции.
Один экземпляр обработчика композиции обрабатывает деревья композиции DirectComposition для всех приложений и дерева композиции DWM, представляющего весь рабочий стол. База данных объектов в режиме ядра и подсистема композиции в пользовательском режиме создаются один раз на сеанс, поэтому компьютер сервера терминалов с несколькими пользователями имеет несколько экземпляров обоих этих компонентов.
На следующей схеме показаны основные компоненты DirectComposition и их связь друг с другом.
Библиотека приложений
Библиотека приложений DirectComposition — это общедоступный API на основе COM с одной плоской точкой входа, экспортируемой из dcomp.dll и возвращающей указатель интерфейса на объект устройства. Объект устройства, в свою очередь, имеет методы для создания всех других объектов, каждый из которых представлен указателем интерфейса. Все интерфейсы DirectComposition наследуются от и полностью реализуют интерфейс IUnknown. Все методы, принимаюющие интерфейсы DirectComposition, проверяют, реализован ли интерфейс внутри dcomp.dll или реализуется ли он другим компонентом. Так как DirectComposition не является расширяемым, методы, которые принимают интерфейсы в качестве параметров, возвращают E_INVALIDARG, если интерфейсы не реализованы в dcomp.dll. API не требует специальных привилегий; его можно вызвать процессами, выполняемыми на самом низком уровне доступа. Однако, поскольку API не работает в сеансе 0, он не подходит для служб. В этих отношениях API DirectComposition похож на другие API Microsoft DirectX, в частности Direct2D, Microsoft Direct3D и Microsoft DirectWrite.
Так как подсистема композиции предназначена исключительно для асинхронного выполнения, свойства объектов в API DirectComposition доступны только для записи. Все свойства имеют методы задания, но не методы получения. Свойства чтения являются не только ресурсоемкими, но и могут быть неточными, так как любое значение, возвращаемое подсистемой композиции, может немедленно стать недействительным. Это может произойти, если, например, независимая анимация привязана к свойству, считываемого.
API является потокобезопасной. Приложение может вызывать любой метод из любого потока в любое время. Тем не менее, так как многие методы API должны вызываться в определенной последовательности, без какой-либо синхронизации приложение может столкнуться с непредсказуемым поведением в зависимости от того, как потоки пересекнуты. Например, если два потока изменяют одно и то же свойство одного объекта на разные значения одновременно, приложение не может предсказать, какие из двух значений будут окончательным значением свойства. Аналогичным образом, если два потока вызывают Фиксация на одном устройстве, ни один поток не получает действительно транзакционного поведения, так как вызов Commit на одном потоке будет отправлять пакет всех команд, выданных обоими потоками, а не только тот, который называется Фиксация.
Система поддерживает все внутреннее состояние на объект устройства. Если приложение создает два или более объектов устройства DirectComposition, приложение может поддерживать независимые пакеты и другое состояние между двумя.
Все объекты DirectComposition имеют сходство объектов устройства; Объекты, созданные определенным объектом устройства, могут использоваться только с этим объектом устройства и могут быть связаны только с другими объектами, созданными тем же объектом устройства. Другими словами, каждый объект устройства — это отдельный разрозненный остров функциональных возможностей. Одним из исключений является визуальный класс, который позволяет создавать визуальные деревья, где визуальный элемент может принадлежать другому объекту устройства, отличному от родительского. Это позволяет сценариям, когда приложение и элемент управления могут управлять одним деревом композиции без необходимости совместного использования одного объекта устройства DirectComposition.
Подсистема композиции
Подсистема композиции DirectComposition выполняется в выделенном процессе, отдельно от любого процесса приложения. Один процесс композиции, dwm.exe, поддерживает каждое приложение в сеансе. Каждое приложение может создавать два визуальных дерева для каждого окна, которому он владеет. Все деревья фактически реализуются в виде поддерев большего визуального дерева, которое также охватывает структуры композиции DWM. DWM создает одно большое визуальное дерево для каждого рабочего стола в сеансе. Ниже приведены основные преимущества этой архитектуры:
- Подсистема композиции имеет доступ ко всем растровым изображениям приложения и визуальным деревьям, что обеспечивает взаимодействие между процессами и композицию окон.
- Подсистема композиции выполняется в доверенном системном процессе, отдельном от любого процесса приложения, что позволяет приложениям с низким доступом безопасно создавать защищенное содержимое.
- Подсистема композиции может определить, когда определенное окно полностью окклюдировано, и избежать использования ресурсов ЦП и графической обработки (GPU), составляющих для окна.
- Подсистема композиции может создаваться непосредственно в буфер задней части экрана, избегая необходимости дополнительной копии, необходимой для обработчиков композиции для каждого процесса.
- Все приложения используют одно устройство Direct3D для композиции, что обеспечивает значительную экономию памяти.
Визуальное дерево — это сохраненная структура. API DirectComposition предоставляет методы для изменения структуры в пакетах изменений, которые обрабатываются атомарно. Корневой объект в API DirectComposition — это объект устройства, который служит фабрикой для всех других объектов DirectComposition и содержит метод, называемый Commit. Подсистема композиции не отражает никаких изменений, внесенных приложением в визуальное дерево, пока приложение не вызовет фиксации, в то время как все изменения с момента последнего фиксации обрабатываются как одна транзакция.
Требование вызова фиксации аналогично концепции "кадра", за исключением того, что, поскольку подсистема композиции выполняется асинхронно, она может представлять несколько различных кадров между вызовами Фиксации. В DirectComposition кадр — это одна итерация подсистемы композиции, а интервал, потраченный приложением между двумя вызовами Commit называется пакетной.
DirectComposition пакетирует все вызовы приложений к API DirectComposition. База данных объектов ядра, реализованная в драйвере сеанса win32k.sys, сохраняет все сведения о состоянии, связанные с вызовами API.
Подсистема композиции создает один кадр для каждого вертикального пустого в дисплее. Кадр запускается на вертикальном пустом месте и предназначен для последующего вертикального пустого. При запуске кадра подсистема композиции выбирает все ожидающие пакеты и включает в себя их команды в этом кадре. Пакетные службы помещаются в очередь ожидания, когда приложение вызывает фиксации, а ожидающая очередь выполняется атомарно в начале кадра. Таким образом, существует одна точка во времени, которая отмечает начало кадра. Все пакеты, отправленные до этой точки, включены в кадр, в то время как все пакеты, отправленные после, должны ждать, пока следующий кадр не будет обработан. Полный цикл композиции выглядит следующим образом:
- Оцените время следующего вертикального пустого.
- Получение всех ожидающих пакетов.
- Обработайте извлеченные пакеты.
- Обновите все анимации с помощью времени, предполагаемого на шаге 1.
- Определите регионы экрана, которые необходимо повторно создать.
- Повторно создайте грязные регионы.
- Создайте кадр, перевернутые задние и передние буферы для каждого экрана.
- Если ничего не было создано и представлено на шагах 6 и 7, дождитесь фиксации пакета.
- Дождитесь следующего вертикального пустого.
Если к одному видеоадаптелю подключено несколько мониторов, подсистема композиции использует вертикальную пустую часть основного монитора для управления циклом композиции и задания времени выборки анимации. Каждый монитор представлен отдельной полноэкранной цепочкой переворачивания; Подсистема композиции повторяет шаги 6 и 7 для каждого монитора в режиме циклического перебора с помощью одного устройства Direct3D. При наличии нескольких видеоадаптеров подсистема композиции использует отдельное устройство Direct3D для каждого видеоадаптера в шагах 6 и 7.
Кадры композиции должны всегда начинаться с вертикального пустого, как показано на следующем рисунке.
кадра композиции
Если подсистема композиции не работает, так как дерево композиции не изменилось, поток композиции спит во время ожидания нового пакета. При отправке нового пакета поток композиции просыпается, но немедленно возвращается в спящий режим до следующей вертикальной пустой. Это позволяет прогнозировать время начала и окончания кадра для приложений и подсистемы композиции.
Подсистема композиции публикует время представления кадров и текущую частоту кадров. Публикация этих сведений позволяет приложениям оценить время презентации для собственных пакетов, что в свою время позволяет синхронизировать анимации. В частности, приложение может использовать сочетание статистики кадров из подсистемы композиции и историческую модель того времени, сколько его поток пользовательского интерфейса занимает для создания пакета, чтобы определить время выборки для собственных анимаций.
Например, в начале пакета приложения, показанного на предыдущем рисунке, приложение может запросить обработчик композиции, чтобы определить точное время представления следующего кадра. Затем приложение может использовать текущее время, а также сведения о предыдущих пакетах, созданных им, чтобы определить, может ли приложение завершить текущий пакет до следующего вертикального пустого. Поэтому приложение использует время представления кадров в качестве времени выборки для собственных анимаций. Если приложение определяет, что маловероятно завершить работу в текущем вертикальном пустом месте, приложение может использовать последующее время кадра в качестве времени выборки, используя сведения о частоте кадров, возвращаемые подсистемой композиции для вычисления этого времени.
Связанные разделы