BitmapCacheBrush

65

Кисть BitmapCacheBrush во многих отношениях напоминает VisualBrush. В то время как VisualBrush предоставляет свойство Visual, ссылающееся на другой элемент, BitmapCacheBrush включает в себя свойство Target, которое служит той же самой цели.

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

Чтобы сконфигурировать кэширование растровых изображений, необходимо установить свойство BitmapCacheBrush.BitmapCache (используя объект BitmapCache). Вот его простейшее применение:

<Button Name="cmd" Margin="3" Padding="5">Is this a real button?</Button>
<Rectangle Margin="3" Height="100">
      <Rectangle.Fill>
         <BitmapCacheBrush Target="{Binding ElementName=cmd}"
           BitmapCache="BitmapCache"></BitmapCacheBrush>
      </Rectangle.Fill>
</Rectangle>

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

По данной причине BitmapCacheBrush не слишком помогает в традиционных окнах. Однако на кэширование растровых изображений стоит обратить внимание в случае интенсивного применения анимации в рамках пользовательского интерфейса. Дело в том, что анимация может заставить окно перерисовываться много раз в секунду. Может оказаться, что сложное векторное содержимое быстрее нарисовать из кэшированного растрового изображения, чем перерисовывать с нуля. Однако и в этой ситуации не стоит торопиться с использованием BitmapCacheBrush. Намного более вероятно, что кэширование будет применяться за счет установки высокоуровневого свойства UIElement.CacheMode каждого элемента, который требуется кэшировать. В этом случае WPF использует BitmapCachebrush "за кулисами", достигая того же эффекта, но с гораздо меньшими усилиями.

С учетом изложенных деталей может показаться, что кисть BitmapCacheBrush не особенно полезна сама по себе. Однако она пригодится, когда есть один фрагмент сложного визуального содержимого, которое нужно рисовать во многих местах. В таком случае можно сэкономить память, кэшируя этот фрагмент однажды в объекте BitmapCacheBrush, вместо того, чтобы кэшировать его отдельно в каждом элементе.

Опять-таки, возможно, что сэкономить не удастся, если только в пользовательском интерфейсе не используется также анимация.

Пройди тесты
Лучший чат для C# программистов