Otimizando o desempenho: Recursos do aplicativo

WPF permite que você compartilhe recursos do aplicativo para que você possa oferecer suporte a um comportamento ou aparência consistente entre elementos de tipos semelhantes. Este tópico fornece algumas recomendações nessa área que podem ajudar você a melhorar o desempenho de seus aplicativos.

Para obter mais informações sobre recursos, consulte Visão geral sobre Recursos.

Compartilhamento de recursos

Se seu aplicativo usa controles personalizados e define os recursos em um ResourceDictionary (ou em um nó de recursos XAML), é recomendável que você defina os recursos no nível do objeto Application Window, ou os defina no tema padrão para os controles personalizados. Definindo os recursos em um controle personalizado do ResourceDictionary impõe um impacto de desempenho para cada instância do controle. Por exemplo, se você tiver operações brush com desempenho intenso definidas como parte da definição de recurso de um controle personalizado e muitas instâncias do controle personalizado, o conjunto de trabalho do aplicativo irá aumentar significativamente.

Para ilustrar esse ponto, considere o seguinte. Digamos que você está desenvolvendo um jogo de cartas usando WPF. Para a maioria dos jogos de cartas, você precisa de 52 cartas com 52 faces diferentes. Você decide implementar um controle personalizado de carta e definir 52 brushes (cada um representando uma face do cartão) nos recursos do seu controle personalizado de carta. No aplicativo principal, você inicialmente cria 52 instâncias deste controle personalizado de carta. Cada instância de controle personalizado de carta gera 52 instâncias de objetos Brush, que resulta em um total de 52 * 52 objetos Brush em seu aplicativo. Removendo os brushes de dentro dos recursos de controle personalizado de carta para o nível de objeto de Application ou Window, ou definindo-os no tema padrão para o controle personalizado, você reduz o conjunto de trabalho do aplicativo, já que você agora está compartilhando os 52 brushes entre as 52 instâncias do controle de carta.

Compartilhar um Brush sem cópia

Se você tiver vários elementos usando o mesmo objeto Brush, defina o Brush como um recurso e referencie-o, em vez de definir o Brush inline no XAML. Esse método criará uma instância e reutilizá-la, enquanto definir Brushes inline no XAML cria uma nova instância para cada elemento.

O exemplo a seguir de marcação ilustra este ponto:

<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>

Usar recursos estáticos quando possível

Um recurso estático fornece um valor para qualquer propriedade de atributo XAML pesquisando uma referência a um recurso já definido. Comportamento de pesquisa para esse recurso é análogo à pesquisa em tempo de compilação.

Um recurso dinâmico, por outro lado, criará uma expressão temporária durante a compilação inicial e de fato adiará a pesquisa por recursos até que o valor de recurso solicitado seja realmente necessário para construir um objeto. Comportamento de pesquisa para esse recurso é análogo à pesquisa em tempo de execução, que impõe um impacto no desempenho. Use recursos estáticos sempre que possível em seu aplicativo, usando recursos dinâmicos somente quando necessário.

O exemplo a seguir de marcação mostra o uso de dois tipos de recursos:

<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>

Consulte também

Conceitos

Optimizing WPF Application Performance

Planejando para desempenho de aplicativos

Otimizando o desempenho: Levando vantagens de hardware

Otimizando o desempenho: Layout and Design

Otimizando o desempenho: 2D Graphics and Imaging

Otimizando o desempenho: Comportamento de objeto

Otimizando o desempenho: Texto

Otimizando o desempenho: Ligação de Dados

Otimizando o desempenho: Outras recomendações

Ferramentas de Desempenho e Recursos do WPF