Compartilhar via


Otimizando o desempenho: recursos do aplicativo

O WPF permite que você compartilhe recursos de aplicativo para que você possa dar suporte a uma aparência ou comportamento consistente entre elementos semelhantes. Este tópico fornece algumas recomendações nessa área que podem ajudá-lo a melhorar o desempenho de seus aplicativos.

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

Compartilhamento de recursos

Se seu aplicativo utiliza controles personalizados e define recursos em um ResourceDictionary (ou nó de recursos XAML), é recomendável que você defina esses recursos no nível do objeto Application ou Window, ou então no tema padrão dos controles personalizados. Definir recursos no ResourceDictionary de um controle personalizado impõe um impacto de desempenho para cada instância desse controle. Por exemplo, se você tiver operações de pincel intensivas em desempenho definidas como parte da definição de recurso de um controle personalizado e se houver muitas instâncias desse controle, 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 o WPF. Para a maioria dos jogos de cartas, você precisa de 52 cartas com 52 rostos diferentes. Você decide implementar um controle personalizado de cartão e define 52 pincéis (cada um representando uma face de cartão) nos recursos do controle personalizado do cartão. Em seu aplicativo principal, inicialmente você cria 52 instâncias desse controle personalizado de cartão. Cada instância do controle personalizado de cartão gera 52 instâncias de objetos Brush, o que oferece um total de 52 * 52 objetos Brush em seu aplicativo. Ao mover os pincéis para fora dos recursos de controle personalizado do cartão para o nível de objeto Application ou Window ou defini-los no tema padrão para o controle personalizado, você reduz o conjunto de trabalho do aplicativo, já que agora está compartilhando os 52 pincéis entre 52 instâncias do controle de cartão.

Compartilhar um pincel sem copiar

Se você tiver vários elementos usando o mesmo objeto Brush, defina o pincel como um recurso e faça referência a ele, em vez de definir o pincel diretamente no XAML. Esse método criará uma instância e a reutilizará, enquanto definir pincéis embutidos em XAML cria 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 desse 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 de recursos até que o valor do recurso solicitado seja realmente necessário para construir um objeto. O comportamento de pesquisa desse recurso é análogo à pesquisa em tempo de execução, 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 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>

Consulte também