Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
WPF proporciona una amplia gama de funciones de imágenes y gráficos 2D que se pueden optimizar para los requisitos de la aplicación. En este tema se proporciona información sobre la optimización del rendimiento en esas áreas.
Dibujo y formas
WPF proporciona objetos Drawing y Shape para representar contenido gráfico de dibujo. Sin embargo, Drawing los objetos son construcciones más sencillas que Shape los objetos y proporcionan mejores características de rendimiento.
Un Shape permite dibujar una forma gráfica en la pantalla. Dado que se derivan de la FrameworkElement clase , Shape los objetos se pueden usar dentro de paneles y la mayoría de los controles.
WPF ofrece varias capas de acceso a gráficos y servicios de representación. En la capa superior, Shape los objetos son fáciles de usar y proporcionan muchas características útiles, como el diseño y el control de eventos. WPF proporciona una serie de objetos de forma listos para usar. Todos los objetos de forma heredan de la clase Shape. Los objetos de forma disponibles incluyen Ellipse, Line, Path, Polygon, Polyliney Rectangle.
Drawing Por otro lado, los objetos no derivan de la FrameworkElement clase y proporcionan una implementación más ligera para representar formas, imágenes y texto.
Hay cuatro tipos de Drawing objetos:
GeometryDrawing Dibuja una forma.
ImageDrawing Dibuja una imagen.
GlyphRunDrawing Dibuja texto.
DrawingGroup Dibuja otros dibujos. Use un grupo de dibujos para combinar otros dibujos en un solo dibujo compuesto.
El GeometryDrawing objeto se usa para representar contenido de geometría. La Geometry clase y las clases concretas que derivan de ella, como CombinedGeometry, EllipseGeometryy PathGeometry, proporcionan un medio para representar gráficos 2D y proporcionar compatibilidad con las pruebas de posicionamiento y el recorte. Los objetos de geometría se pueden usar para definir la región de un control o, por ejemplo, para definir la región de recorte que se aplicará a una imagen. Los objetos geométricos pueden ser regiones simples, como rectángulos y círculos, o regiones compuestas creadas a partir de dos o más objetos de geometría. Se pueden crear regiones geométricas más complejas mediante la combinación de PathSegmentobjetos derivados de , como ArcSegment, BezierSegmenty QuadraticBezierSegment.
En la superficie, la Geometry clase y la Shape clase son similares. Ambos se usan en la representación de gráficos 2D y ambos tienen clases concretas similares que derivan de ellas, por ejemplo, EllipseGeometry y Ellipse. Sin embargo, hay diferencias importantes entre estos dos conjuntos de clases. Por un lado, la Geometry clase carece de algunas de las funciones de la Shape clase, como la capacidad de representarse a sí misma. Para dibujar un objeto geométrico, se debe usar otra clase como DrawingContext, Drawing o Path (vale la pena tener en cuenta que Path es una Forma) para realizar la operación de dibujo. Las propiedades de representación, como el relleno, el trazo y el grosor del trazo, se encuentran en la clase que dibuja el objeto de geometría, mientras que un objeto de forma contiene estas propiedades. Una manera de entender esta diferencia es que un objeto de geometría define una región, por ejemplo, un círculo, mientras que un objeto de forma no solo define una región, sino que también determina cómo se rellena y se delinea esa región, además de participar en el sistema de disposición.
Dado que los objetos Shape derivan de la clase FrameworkElement, al usarlos, se puede incrementar significativamente el consumo de memoria en su aplicación. Si realmente no necesita las características FrameworkElement para su contenido gráfico, considere usar los objetos Drawing más ligeros.
Para obtener más información sobre Drawing los objetos, vea Información general sobre objetos de dibujo.
Objetos StreamGeometry
El objeto StreamGeometry es una alternativa ligera a PathGeometry para crear formas geométricas. Use un StreamGeometry elemento cuando necesite describir una geometría compleja. StreamGeometry está optimizado para controlar muchos PathGeometry objetos y funciona mejor en comparación con el uso de muchos objetos individuales PathGeometry .
En el ejemplo siguiente se usa la sintaxis de atributo para crear un triangular StreamGeometry en XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Path Data="F0 M10,100 L100,100 100,50Z"
StrokeThickness="1" Stroke="Black"/>
</StackPanel>
</Page>
Para obtener más información sobre StreamGeometry los objetos, vea Crear una forma mediante streamGeometry.
Objetos DrawingVisual
El DrawingVisual objeto es una clase de dibujo ligera que se usa para representar formas, imágenes o texto. Esta clase se considera ligera porque no proporciona diseño ni control de eventos, lo que mejora su rendimiento. Por esta razón, los dibujos son ideales para fondos y imágenes prediseñadas. Para obtener más información, vea Uso de objetos DrawingVisual.
Imágenes
La creación de imágenes de WPF proporciona una mejora significativa de las funcionalidades de creación de imágenes en versiones anteriores de Windows. Las funcionalidades de creación de imágenes, como mostrar un mapa de bits o usar una imagen en un control común, se controlaron principalmente mediante la interfaz de dispositivo gráfico (GDI) de Microsoft Windows o la interfaz de programación de aplicaciones (API) de Microsoft Windows GDI+. Estas API proporcionaban funcionalidad de creación de imágenes de línea base, pero faltaban características como la compatibilidad con la extensibilidad de códecs y compatibilidad con imágenes de alta fidelidad. Las API de imágenes de WPF se han rediseñado para superar las deficiencias de GDI y GDI+ y proporcionar un nuevo conjunto de API para mostrar y usar imágenes dentro de las aplicaciones.
Al usar imágenes, tenga en cuenta las siguientes recomendaciones para obtener un mejor rendimiento:
Si la aplicación requiere que muestre imágenes en miniatura, considere la posibilidad de crear una versión de tamaño reducido de la imagen. De forma predeterminada, WPF carga la imagen y la descodifica a su tamaño completo. Si solo quiere una versión en miniatura de la imagen, WPF innecesariamente decodifica la imagen a su tamaño completo y luego la escala a un tamaño de miniatura. Para evitar esta sobrecarga innecesaria, puede solicitar a WPF que descodifique la imagen en un tamaño de miniatura o solicitar a WPF que cargue una imagen de tamaño de miniatura.
Descodificar siempre la imagen al tamaño deseado y no al tamaño predeterminado. Como se mencionó anteriormente, solicite a WPF que descodifique la imagen en un tamaño deseado y no el tamaño completo predeterminado. No solo reducirá el conjunto de trabajo de la aplicación, sino que también disminuirá la velocidad de ejecución.
Si es posible, combine las imágenes en una sola imagen, como una tira de película compuesta por varias imágenes.
Para obtener más información, consulte Información general sobre la creación de imágenes.
BitmapScalingMode
Al animar la escala de cualquier mapa de bits, el algoritmo predeterminado de remuestreo de imágenes de alta calidad a veces puede consumir recursos del sistema suficientes para provocar una degradación de la tasa de fotogramas, lo que hace que las animaciones se entrecorten. Al establecer la propiedad del objeto BitmapScalingMode a RenderOptions, puede crear una animación más fluida al escalar un mapa de bits. LowQuality mode indica al motor de representación de WPF que cambie de un algoritmo optimizado para calidad a un algoritmo optimizado para velocidad al procesar imágenes.
En el siguiente ejemplo se muestra cómo establecer el BitmapScalingMode para un objeto de imagen.
// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
' Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality)
Almacenamiento en cachéHint
De forma predeterminada, WPF no almacena en caché el contenido representado de TileBrush objetos, como DrawingBrush y VisualBrush. En escenarios estáticos en los que el contenido o el uso de TileBrush en la escena no cambian, esto tiene sentido, ya que conserva la memoria de vídeo. No tiene tanta sentido cuando se usa un TileBrush objeto con contenido estático de forma no estática, por ejemplo, cuando se asigna una estática DrawingBrush o VisualBrush se asigna a la superficie de un objeto 3D giratorio. El comportamiento predeterminado de WPF es volver a representar todo el contenido de DrawingBrush o VisualBrush para cada fotograma, aunque el contenido no cambie.
Al establecer la propiedad del CachingHint objeto RenderOptions a Cache, puede aumentar el rendimiento usando versiones en caché de los objetos de pincel en mosaico.
Los CacheInvalidationThresholdMinimum valores de propiedad y CacheInvalidationThresholdMaximum son valores de tamaño relativos que determinan cuándo se debe volver a generar el TileBrush objeto debido a cambios en la escala. Por ejemplo, estableciendo la propiedad CacheInvalidationThresholdMaximum en 2.0, la memoria caché TileBrush debe volver a generarse solo cuando su tamaño supera el doble del tamaño de la caché actual.
En el ejemplo siguiente se muestra cómo usar la opción de sugerencia de almacenamiento en caché para un DrawingBrush.
DrawingBrush drawingBrush = new DrawingBrush();
// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);
// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
Dim drawingBrush As New DrawingBrush()
' Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache)
' Set the minimum and maximum relative sizes for regenerating the tiled brush.
' The tiled brush will be regenerated and re-cached when its size is
' 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5)
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0)
Consulte también
.NET Desktop feedback