Поделиться через


Поверхность композиции

Заметка

Для приложений в 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 и фиксации является единственным способом просмотра изменений в точечных изображениях на экране. Каждый вызов EndDraw должен иметь соответствующий вызов BeginDraw, чтобы удалить прямоугольник охранника. Логическая поверхность сохраняет все обновления до вызова фиксации. Вы также можете вызвать EndDraw на поверхности, которая находится в состоянии SuspendDraw, так как EndDraw является подразумеваемым возобновлением или завершением. После вызова EndDrawобновленный контент отображается на экране и удаляется, чтобы память для обновления можно было повторно использовать для последующего обновления.

Пример использования логической поверхности

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

  1. Создайте устройство DirectComposition.
  2. Создайте визуальное дерево, состоящее из корневого узла и визуальных элементов 1 и 2.
  3. Создайте логические поверхности 1 и 2.
  4. Вызовите SetContent, чтобы связать логическую поверхность с визуальными элементами 1 и 2.
  5. Вызовите BeginDraw в подстановке логического поверхности 1.
  6. Обновите поверхность в смещение, возвращенное DirectComposition.
  7. Необязательные действия:
    1. Вызов SuspendDraw на логической поверхности 1.
    2. Вызов BeginDraw в подэкранте логического поверхности 2.
    3. Обновите поверхность в смещение, возвращенное DirectComposition.
    4. Вызов EndDraw на логической поверхности 2.
    5. Вызов ResumeDraw на логической поверхности 1.
  8. Обновите поверхность в смещение, возвращенное DirectComposition.
  9. Вызов EndDraw на логической поверхности 1.
  10. Вызов фиксации.

Виртуальная поверхность DirectComposition

DirectComposition предоставляет интерфейс IDCompositionVirtualSurface для представления виртуальной поверхности, которая представляет собой коллекцию логических поверхностей (плиток), расположенных в фиксированной сетке с плитками фиксированного размера. Приложение указывает размер виртуальной текстуры во время создания. Размер устанавливает границы виртуальной поверхности. Поверхность может быть связана с одним или несколькими визуальными элементами.

При инициализации виртуальной поверхности она не поддерживается фактическими выделениями. Другими словами, он не содержит битов. DirectComposition выделяет плитки (т. е. объекты поверхности композиции) после того, как приложение начнет обновлять поверхность. Приложение обновляет виртуальную поверхность, вызывая BeginDraw и указывая интересующий регион в отношении координат виртуальной поверхности. Затем DirectComposition выделяет необходимые плитки для хранения обновления и возвращает область композиции и смещение для обновления.

Как и в логических поверхностях, можно вызывать BeginDraw, SuspendDraw, ResumeDraw и EndDraw на виртуальной поверхности. Кроме того, DirectComposition предоставляет методы, которые можно использовать для изменения размера и обрезки существующей виртуальной поверхности.

Изменение размера виртуальной поверхности

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

На следующем рисунке показан размер виртуальной поверхности от 3 до 3 до 2–2. Красный регион представляет плитки, которые удаляются в рамках операции изменения размера, а память удаляется DirectComposition. После изменения размера приложение не может обновлять красный регион, не изменяя размер виртуальной поверхности еще раз.

изменение размера виртуальной поверхности

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

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

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

Обрезка виртуальной поверхности

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

На следующем рисунке зеленый квадрат — это окно просмотра приложения. Приложение изначально отрисовывает первые шесть плиток (синий) виртуальной поверхности (светло-серый), которые находятся в режиме просмотра. Поскольку страница, представленная прокруткой виртуальной поверхности, приложение должно отобразить последние шесть плиток. Приложение вызывает обрезку, чтобы указать, что регион, определенный последними шестью плитками, находится там, где находится содержимое, а остальные не нужны в данный момент. DirectComposition может затем выбрать перезапуск логических поверхностей, которые первоначально представляли первые шесть плиток (темно-серый).

обрезание виртуальной поверхности

Основные понятия DirectComposition