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


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

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

Дополнительные сведения о ресурсах см. в разделе XAML ресурсов.

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

Если ваше приложение использует пользовательские элементы управления и определяет ресурсы в 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>

См. также