Otimizando desempenho: recursos do aplicativo

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

Para obter mais informações sobre recursos, consulte Recursos de XAML.

Compartilhando recursos

Se seu aplicativo usa controles personalizados e define recursos em um ResourceDictionary (ou nó Recursos XAML), é recomendável definir os recursos no nível do objeto ou Window defini-los no Application tema padrão para os controles personalizados. A definição de recursos em um controle personalizado impõe um impacto no desempenho de ResourceDictionary cada instância desse controle. Por exemplo, se você tiver operações de pincel com uso intenso de desempenho 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 aumentará significativamente.

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

Compartilhando um pincel sem copiar

Se você tiver vários elementos usando o mesmo Brush objeto, defina o pincel como um recurso e faça referência a ele, em vez de definir o pincel embutido em XAML. Esse método criará uma instância e a reutilizará, enquanto a definição de pincéis embutidos em XAML criará uma nova instância para cada elemento.

O exemplo de marcação a seguir 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 atributo de propriedade XAML pesquisando uma referência a um recurso já definido. O 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, portanto, adiará a pesquisa por recursos até que o valor de recurso solicitado seja realmente necessário para construir um objeto. O comportamento de pesquisa para esse recurso é análogo à pesquisa de tempo de execução, que causa um impacto ao desempenho. Use recursos estáticos sempre que possível em seu aplicativo, usando recursos dinâmicos somente quando necessário.

O exemplo de marcação a seguir mostra o uso de ambos os 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>

Confira também