Оптимизация производительности: ресурсы приложения

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

Дополнительные сведения о ресурсах содержатся в разделе Общие сведения о ресурсах.

Общий доступ к ресурсам

Если приложение использует пользовательские элементы управления и определяет ресурсы в объекте ResourceDictionary (или на узле ресурсов XAML), рекомендуется определить ресурсы на уровне объекта Application или Window либо определить их в теме по умолчанию для пользовательских элементов управления. Определение ресурсов в объекте ResourceDictionary пользовательского элемента управления влияет на производительность каждого экземпляра этого элемента управления. Например, при интенсивных действиях с кистью, требующих высокой производительности, определенных как часть определения ресурсов для нескольких экземпляров пользовательского элемента управления, значительно увеличивается рабочее множество приложения.

Чтобы проиллюстрировать это, рассмотрим следующее. Предположим, что с помощью WPF разрабатывается карточная игра. Для большинства карточных игр необходимо 52 карты с 52 различными вариантами лицевой стороны. Было решено реализовать пользовательский карточный элемент управления и определить 52 кисти (для лицевой стороны каждой карты) в ресурсах этого пользовательского элемента управления. В главном приложении первоначально создается 52 экземпляра этого пользовательского карточного элемента управления. Каждый экземпляр этого элемента управления создает 52 экземпляра объекта Brush, что в итоге дает 52 * 52 объектов Brush в приложении. Перемещая кисти из ресурсов этого элемента управления на уровень объекта Application или Window либо определяя их для пользовательского элемента управления в теме по умолчанию, можно уменьшить рабочее множество приложения, так как теперь 52 экземпляра пользовательского элемента управления совместно используют 52 кисти.

Общее использование кисти без копирования

Если имеется несколько элементов, использующих один объект Brush, определите кисть как ресурс и получите ссылку на него, вместо определения встроенной в XAML кисти. Этот метод создаст один экземпляр и повторно использует его, тогда как определение встроенной в XAML кисти создает новый экземпляр для каждого элемента.

Это иллюстрируется в следующем примере разметки:

<StackPanel.Resources>
  <LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
    <LinearGradientBrush.GradientStops>
      <GradientStopCollection>
        <GradientStop Color="GoldenRod" Offset="0" />
        <GradientStop Color="White" Offset="1" />
      </GradientStopCollection>
    </LinearGradientBrush.GradientStops>
  </LinearGradientBrush>
</StackPanel.Resources>

<!-- Non-shared Brush object. -->
<Label>
  Label 1
  <Label.Background>
    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
      <LinearGradientBrush.GradientStops>
        <GradientStopCollection>
          <GradientStop Color="GoldenRod" Offset="0" />
          <GradientStop Color="White" Offset="1" />
        </GradientStopCollection>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Label.Background>
</Label>

<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>

Использование статических ресурсов, если это возможно

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

С другой стороны, во время начальной компиляции динамический ресурс создаст временное выражение и, таким образом, поиск ресурсов отложится до тех пор, пока запрашиваемое значение ресурса не потребуется для создания объекта. Поиск такого ресурса аналогичен поиску во время выполнения, что оказывает влияние на производительность. Используйте статические ресурсы в приложении по мере возможности, а динамические — только по необходимости.

В следующем примере разметки показано использование обоих типов ресурсов:

<StackPanel.Resources>
  <SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>

<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>

<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>

См. также

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

Улучшение производительности приложений WPF

Планирование производительности приложения

Оптимизация производительности. Использование преимуществ аппаратного ускорения

Оптимизация производительности: разметка и разработка

Оптимизация производительности: двумерная графика и обработка изображений

Оптимизация производительности: поведение объекта

Оптимизация производительности: отображение текста

Оптимизация производительности: привязка данных

Оптимизация производительности. Дополнительные рекомендации