Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Optimizar el rendimiento: Recursos de aplicación

 

Publicada: junio de 2016

WPF permite compartir los recursos de aplicación, a fin de permitirle utilizar una apariencia o un comportamiento coherentes en elementos de tipos parecidos. En este tema se proporcionan algunas recomendaciones en este sentido que pueden ayudarle a mejorar el rendimiento de sus aplicaciones.

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

Si la aplicación utiliza controles personalizados y define recursos en un diccionario de recursos (ResourceDictionary) (o nodo de recursos XAML), se recomienda que defina los recursos en el nivel del objeto Application o Window, o bien que los defina en el tema predeterminado para los controles personalizados. Definir los recursos en un control ResourceDictionary personalizado afecta negativamente al rendimiento para cada instancia de ese control. Por ejemplo, si ha realizado operaciones de pincel que deterioran el rendimiento definidas como parte de la definición de recurso de un control personalizado y muchas instancias del control personalizado, el espacio de trabajo de la aplicación aumentará significativamente.

Para ilustrar este punto, estudie lo siguiente. Supongamos que está programando un juego de cartas mediante WPF. Para la mayoría de los juegos de cartas, necesita 52 cartas con 52 caras diferentes. Decide implementar un control de carta personalizado y definen 52 pinceles (cada uno de ellos representa una cara de carta) en los recursos del control de carta personalizado. En la aplicación principal, crea inicialmente 52 instancias del control de carta personalizado. Cada instancia del control de carta personalizado genera 52 instancias de objetos Brush, con lo que tenemos un total de 52 * 52 objetos Brush en la aplicación. Si saca los pinceles de los recursos del control personalizado y los coloca en el nivel del objeto Application o Window, o los define en el tema predeterminado del control personalizado, reducirá el espacio de trabajo de la aplicación, puesto que ahora compartirá los 52 pinceles entre las 52 instancias del control de carta.

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 insertado en XAML. Este método creará una instancia y la reutilizará, mientras que al definir los pinceles insertados en XAML, se crea una nueva instancia para cada elemento.

En el ejemplo de marcado siguiente se ilustra 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>

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.

Un recurso dinámico, por otro lado, creará una expresión temporal durante la compilación inicial y, de este modo, diferirá la consulta de recursos hasta que el valor de recurso solicitado se necesite realmente para construir un objeto. El comportamiento de búsqueda de ese recurso es análogo a la búsqueda en tiempo de ejecución, que afecta negativamente al rendimiento. Siempre que sea posible, utilice recursos estáticos en la aplicación, y utilice los recursos dinámicos únicamente 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>
Mostrar: