Optimizar el rendimiento: Recursos de aplicación

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

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

Uso compartido de recursos

Si su aplicación utiliza controles personalizados y define recursos en un ResourceDictionary (o en el nodo Recursos XAML), se recomienda definir los recursos en el nivel de objeto Application o Window, o definirlos en el tema predeterminado para los controles personalizados. Definir recursos en el ResourceDictionary de un control personalizado impone un impacto en el rendimiento para cada instancia de ese control. Por ejemplo, si tiene operaciones de pincel con un uso intensivo del 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 ilustrarlo mejor, considere lo siguiente. Supongamos que está desarrollando un juego de cartas con WPF. Para la mayoría de los juegos de cartas, necesita 52 cartas con 52 caras diferentes. Decide implementar un control personalizado de cartas y define 52 pinceles (cada uno representando una cara de carta) en los recursos de su control personalizado de cartas. En la aplicación principal, inicialmente creará 52 instancias de este control personalizado de cartas. Cada instancia del control personalizado de cartas genera 52 instancias de objetos Brush, lo que da un total de 52 * 52 objetos Brush en su aplicación. Al mover los pinceles fuera de los recursos del control personalizado de cartas al nivel de objeto Application o Window, o al definirlas 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 cartas.

Compartir un pincel sin copiar

Si tiene varios elementos que utilizan el mismo objeto Brush, defina el pincel como un recurso y haga referencia a él, en lugar de definir el pincel en línea en XAML. Este método creará una instancia y la reutilizará, mientras que la definición de pinceles insertados en XAML crea una nueva instancia para cada elemento.

Esto se ilustra en el ejemplo siguiente:

<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 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 al de la búsqueda en tiempo de compilación.

Un recurso dinámico, en cambio, creará una expresión temporal durante la compilación inicial y, por lo 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>

Vea también