Partilhar via


Otimizando o desempenho: recursos do aplicativo

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

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

Partilha de recursos

Se a sua aplicação usa controlos personalizados e define recursos num ResourceDictionary (ou nó de Recursos XAML), é recomendável que defina os recursos ao nível do objeto Application ou Window, ou que os defina no tema padrão para os controlos personalizados. A definição de recursos no ResourceDictionary de um controle personalizado impõe um impacto no desempenho para cada instância desse controle. Por exemplo, se existirem operações de pincéis intensivas em termos de desempenho definidas como parte da definição de recursos de um controlo personalizado e muitas instâncias do controlo personalizado, o conjunto de trabalho da aplicação aumentará significativamente.

Para ilustrar este 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 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 seu controle personalizado de cartão. Em seu aplicativo principal, você cria inicialmente 52 instâncias desse controle personalizado de cartão. Cada instância do controle personalizado do cartão gera 52 instâncias de objetos Brush, o que lhe dá um total de 52 * 52 Brush objetos 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.

Partilhar um pincel sem o duplicar

Se tiveres vários elementos a usar o mesmo objeto Brush, define o brush como um recurso e faz referência a ele, em vez de definires o brush inline 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 esse 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>

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

Ver também