Поверхность композиции
Примечание
Для приложений на Windows 10 рекомендуется использовать API Windows.UI.Composition вместо DirectComposition. Дополнительные сведения см. в статье Модернизация классического приложения с помощью визуального слоя.
В этом разделе описываются типы поверхностей, поддерживаемые Microsoft DirectComposition.
Логическая поверхность DirectComposition
DirectComposition предоставляет объект IDCompositionSurface для представления поверхности логической композиции. DirectComposition предоставляет ИНТЕРФЕЙСы API, которые можно использовать для создания, обновления и удаления этих логических поверхностей. Каждая поверхность может быть связана с одним или несколькими визуальными элементами. Приложение отвечает за управление временем существования логических поверхностей.
Обновление логической поверхности
Приложение может обновить логическую поверхность, вызвав BeginDraw и указав размер и смещение прямоугольника на логической поверхности, которую приложение хочет обновить. DirectComposition выделяет прямоугольник указанного размера, а затем возвращает поверхность и соответствующее смещение, которое приложение должно нарисовать или обновить. Ограничения прямоугольника обновления привязаны к размеру поверхности. Например, прямоугольник обновления для поверхности 40 на 100 пикселей может иметь размер до (0,0,40,100). Кроме того, обновляемая область принудительно применяется прямоугольником защиты. Так как одновременно может быть только один прямоугольник защиты, одновременно можно обновлять только одну логическую поверхность. BeginDraw возвращает код ошибки, если метод EndDraw или SuspendDraw не был вызван после предыдущего вызова BeginDraw. Приложение может добавить зафиксированный вызов BeginDraw в пакет, но он не вступит в силу до тех пор, пока не будет вызван и зафиксирован Метод EndDraw .
Приостановка обновлений на логической поверхности
Приложение, которому необходимо обновить различные поверхности, может вызвать SuspendDraw в текущем обновлении, а затем вызвать BeginDraw , чтобы начать новое обновление. Microsoft DirectComposition допускает несколько обновлений, но одновременно может быть активным только один из них. Это означает, что необходимо вызвать SuspendDraw или EndDraw на одной поверхности, прежде чем вызывать BeginDraw на следующей. В отличие от EndDraw, зафиксированный пакет может содержать поверхность, которая находится в состоянии SuspendDraw , но такие обновления не будут отображаться на экране, пока не будет вызван метод EndDraw .
Возобновление обновлений на логической поверхности
Приложение может возобновить обновление поверхности, которая находится в состоянии SuspendDraw , вызвав ResumeDraw. Этот метод можно вызывать только на подвесной поверхности.
Завершение обновлений логической поверхности
Вызовы EndDraw и Commit — единственный способ увидеть изменения в обновлении растрового изображения на экране. Каждый вызов EndDraw должен иметь соответствующий вызов BeginDraw , чтобы удалить прямоугольник защиты. Логическая область сохраняет все обновления, пока не будет вызвана фиксация . Вы также можете вызвать EndDraw на поверхности, которая находится в состоянии SuspendDraw , так как EndDraw является подразумеваемым возобновлением или завершением. После вызова EndDraw обновленное содержимое отображается на экране и удаляется, чтобы память для обновления можно было повторно использовать для последующего обновления.
Пример использования логической поверхности
В следующем примере описываются действия, которые будут предприняты приложением, если оно создаст визуальное дерево, состоящее из двух визуальных элементов, а затем потребуется обновить определенные области двух логических поверхностей, связанных с визуальными элементами:
- Создайте устройство DirectComposition.
- Создайте визуальное дерево, состоящее из корневого узла и визуальных элементов 1 и 2.
- Создайте логические поверхности 1 и 2.
- Вызовите SetContent , чтобы связать логическую поверхность с визуальными элементами 1 и 2.
- Вызовите BeginDraw для подкаталога логической поверхности 1.
- Обновите поверхность в смещении, возвращаемом DirectComposition.
- Другие возможные шаги.
- Вызовите SuspendDraw на логической поверхности 1.
- Вызовите BeginDraw для подпрукта логической поверхности 2.
- Обновите поверхность в смещении, возвращаемом DirectComposition.
- Вызовите EndDraw на логической поверхности 2.
- Вызов resumeDraw на логической поверхности 1.
- Обновите поверхность в смещении, возвращаемом DirectComposition.
- Вызовите EndDraw на логической поверхности 1.
- Вызов фиксации.
Виртуальная поверхность DirectComposition
DirectComposition предоставляет интерфейс IDCompositionVirtualSurface для представления виртуальной поверхности, которая представляет собой коллекцию логических поверхностей (плиток), расположенных в фиксированной сетке с плитками фиксированного размера. Приложение указывает размер виртуальной текстуры во время создания. Размер определяет границы виртуальной поверхности. Поверхность может быть связана с одним или несколькими визуальными элементами.
При инициализации виртуальной поверхности она не поддерживается фактическими выделениями. Другими словами, он не содержит никаких битов. DirectComposition выделяет плитки (т. е. объекты поверхности композиции) после того, как приложение начнет обновлять поверхность. Приложение обновляет виртуальную поверхность, вызывая BeginDraw и указывая интересующую область относительно координат виртуальной поверхности. Затем DirectComposition выделяет необходимые плитки для хранения обновления и возвращает поверхность композиции и смещение для обновления.
Как и в случае с логическими поверхностями, вы можете вызывать BeginDraw, SuspendDraw, ResumeDraw и EndDraw на виртуальной поверхности. Кроме того, DirectComposition предоставляет методы, которые можно использовать для изменения размера и обрезки существующей виртуальной поверхности.
Изменение размера виртуальной поверхности
Метод Изменить размер изменяет границы виртуальной поверхности, то есть все новые обновления или выделения должны находиться в границах, заданных новым размером. Приложение использует resize , чтобы сообщить DirectComposition, что определенная область виртуальной поверхности больше не нужна и может быть освобождена. Если изменение размера уменьшает виртуальную поверхность, приложение больше не сможет обновлять регионы за пределами новых границ.
На следующем рисунке показана виртуальная поверхность с размерами 3 на 3, измененная на 2 на 2. Красная область представляет плитки, которые удаляются в рамках операции изменения размера, а память освобождается DirectComposition. После изменения размера приложение не сможет обновить красную область без повторного изменения размера виртуальной поверхности.
Операция изменения размера вступает в силу немедленно. DirectComposition не ждет, пока приложение вызовет Commit , чтобы изменить размер. Например, предположим, что приложение выполняет следующую последовательность вызовов.
pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();
В этом примере приложение теряет все содержимое при первом изменении размера. Второе изменение размера не влияет, даже если оно было вызвано до фиксации. В этом случае на экране ничего не отображается.
Обрезка виртуальной поверхности
Метод Trim определяет область виртуальной поверхности, которая требуется приложению. Он не изменяет размер границ виртуальной поверхности, но сообщает DirectComposition, какие логические поверхности в настоящее время необходимо выделить.
На следующем рисунке зеленый квадрат является окном просмотра приложения. Изначально приложение отрисовывает первые шесть плиток (синяя) виртуальной поверхности (светло-серая), которые находятся в окне просмотра. Так как страница, представленная виртуальной поверхностью, прокручивается, приложение должно отобразить последние шесть плиток. Приложение вызывает Trim , чтобы указать, что область, определенная последними шестью плитками, находится там, где находится содержимое, а остальные в данный момент не нужны. Затем DirectComposition может выбрать для перезапуска логические поверхности, которые изначально представляли первые шесть плиток (темно-серый).
Связанные темы