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 usa controles personalizados e define recursos em um ResourceDictionary (ou nó recursos XAML), é recomendável que você defina os recursos no nível de objeto Application ou no tema padrão para os controles personalizados Window. Definir recursos em um controle ResourceDictionary personalizado impõe um impacto de desempenho para cada instância desse controle. Por exemplo, se você tiver operações de pincel com uso intensivo 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 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 Brush objetos, o que oferece um total de 52 * 52 Brush objetos em seu aplicativo. Movendo os pincéis para fora dos recursos do controle de cartão personalizado para o nível de objeto Application ou Window, ou definindo-os no tema padrão para o controle personalizado, você reduz o conjunto de trabalho do aplicativo, pois agora está compartilhando os 52 pincéis com 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 defini-lo diretamente no XAML. Esse método criará uma instância e a reutilizará, enquanto declarar pincéis em linha 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 durante a 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