Compartir a través de


Optimización del rendimiento: recursos de la aplicación

WPF permite compartir recursos de aplicación para mantener una apariencia o comportamiento coherente en elementos del mismo tipo. En este tema se proporcionan algunas recomendaciones en esta área que pueden ayudarle a mejorar el rendimiento de las aplicaciones.

Para obtener más información sobre los recursos, consulta Recursos XAML.

Uso compartido de recursos

Si su aplicación usa controles personalizados y define recursos en un nodo de recursos XAML ResourceDictionary, se recomienda definir los recursos en el nivel de objeto Application o definirlos en el tema predeterminado para los controles personalizados Window. La definición de recursos en un control ResourceDictionary personalizado impone un impacto en el rendimiento para cada instancia de ese control. Por ejemplo, si tiene operaciones de pincel de alto rendimiento definidas como parte de la definición de recursos de un control personalizado y muchas instancias del control personalizado, el conjunto de trabajo de la aplicación aumentará significativamente.

Para ilustrar este punto, tenga en cuenta lo siguiente. Supongamos que está desarrollando un juego de cartas mediante WPF. Para la mayoría de los juegos de cartas, necesitas 52 cartas con 52 caras diferentes. Decide implementar un control personalizado de tarjeta y definir 52 pinceles (cada uno representa una cara de tarjeta) en los recursos del control personalizado de la tarjeta. En la aplicación principal, inicialmente creará 52 instancias de este control personalizado de tarjeta. Cada instancia del control personalizado de tarjeta genera 52 instancias de Brush objetos, lo que proporciona un total de 52 * 52 Brush objetos en la aplicación. Al mover los pinceles de los recursos del control de tarjeta personalizado al nivel de objeto Application o Window, o definirlos en el tema predeterminado del control personalizado, se reduce el conjunto de trabajo de la aplicación, ya que ahora se comparten los 52 pinceles entre 52 instancias del control de tarjeta.

Compartir un pincel sin copiar

Si tienes varios elementos con el mismo Brush objeto, define el pincel como un recurso y hace referencia a él, en lugar de definir la línea de pincel en XAML. Este método creará una instancia y la reutilizará, mientras que definir pinceles en línea en XAML crea una nueva instancia para cada elemento.

En el ejemplo de marcado siguiente se muestra este punto:

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

Uso de recursos estáticos cuando sea posible

Un recurso estático proporciona un valor para cualquier atributo de propiedad XAML buscando una referencia a un recurso ya definido. El comportamiento de búsqueda de ese recurso es análogo a la búsqueda en tiempo de compilación.

Por otro lado, un recurso dinámico creará una expresión temporal durante la compilación inicial y, por tanto, aplazará la búsqueda de recursos hasta que el valor del recurso solicitado sea realmente necesario para construir un objeto. El comportamiento de búsqueda de ese recurso es análogo a la búsqueda en tiempo de ejecución, lo que impone un impacto en el rendimiento. Use recursos estáticos siempre que sea posible en la aplicación, con recursos dinámicos solo cuando sea necesario.

En el ejemplo de marcado siguiente se muestra el uso de ambos 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 también