Partilhar via


Otimizando o desempenho: 2D Graphics and Imaging

WPF fornece uma variedade grande de gráficos 2D e funcionalidade de imagem que pode ser otimizada para suas necessidades de aplicativo. Este tópico fornece informações sobre otimização de desempenho nessas áreas.

Este tópico contém as seguintes seções.

  • Desenho e formas
  • Objetos StreamGeometry
  • Objetos DrawingVisual
  • Imagens
  • Tópicos relacionados

Desenho e formas

WPF fornece tanto objetos Drawing quanto Shape para representar conteúdo de desenho gráfico. No entanto, objetos Drawing são construções mais simples do que objetos Shape e fornecem melhores características de desempenho.

Um Shape permite que você desenhar uma forma gráfica na tela. Como eles são derivados da classe FrameworkElement, objetos Shape podem ser usados dentro de painéis e da maioria dos controles.

WPF oferece vários níveis de acesso aos elementos gráficos e serviços de renderização. Na camada superior, Shape objetos são fáceis de usar e fornecem vários recursos úteis, sistema autônomo, por exemplo, layout e a manipulação de eventos. WPF Fornece um número de objetos forma prontos para uso. Todos os objetos de forma herdam da classe Shape. Objetos de forma disponíveis incluem Ellipse, Line, Path, Polygon, Polyline e Rectangle.

Objetos Drawing, por outro lado, não derivam da classe FrameworkElement e fornecem uma implementação mais leve para processamento de formas, imagens e texto.

Há quatro tipos de objetos Drawing:

O objeto GeometryDrawing é usado para processar conteúdo de geometria. A classe Geometry e as classes concretas que derivam dela, como CombinedGeometry,EllipseGeometry e PathGeometry, fornecem um meio para processamento de gráficos 2D, bem como fornecer teste de acertos e suporte a recorte. Objetos geométricos podem ser usados para definir a região de um controle, por exemplo, ou para definir a região de corte para aplicar a uma imagem. Objetos geométricos podem ser regiões simples, como retângulos e círculos, ou compostos, criados a partir dois ou mais objetos geométricos. Regiões geométricas mais complexas podem ser criadas por combinação de objetos derivados de PathSegment, como ArcSegment, BezierSegment e QuadraticBezierSegment.

Na superfície, a classe Geometry e a classe Shape são bastante semelhantes. Ambas são usados no processamento de gráficos 2D e possuem classes concretas semelhantes que derivam delas, por exemplo, EllipseGeometry e Ellipse. No entanto, existem diferenças importantes entre esses dois conjuntos de classes. Por exemplo, a classe Geometry falta algumas das funcionalidades da classe Shape, como a capacidade para desenho próprio. Para desenhar um objeto geométrico, outra classe, como DrawingContext, Desenho ou um Caminho (vale indicar que um Caminho é uma Forma) deve ser usada para executar a operação de desenho. Propriedades de processamento, como preenchimento, traço e a espessura de traço estão na classe que desenha o objeto geométrico, enquanto um objeto de forma contém essas propriedades. Uma maneira de pensar nessa diferença é que um objeto geométrico define uma região, um círculo por exemplo, enquanto um objeto de forma define uma região, define como essa região é preenchida e descrita e participa do sistema de layout.

Como os objetos Shape derivam da classe FrameworkElement, usá-los pode adicionar significativamente mais consumo de memória no seu aplicativo. Se realmente não forem necessárias os recursos FrameworkElement para seu conteúdo gráfico, considere usar os objetos Drawing mais leves.

Para obter mais informações sobre objetos Drawing, consulte Visão Geral de Objetos de Desenho.

Objetos StreamGeometry

O objeto StreamGeometry é uma alternativa mais leve ao PathGeometry para criar formas geométricas. Use um StreamGeometry Quando você precisar descrever uma geometria complexa. StreamGeometry é otimizado para lidar com muitos PathGeometry objetos e tem melhor desempenho quando comparadas às usando muitas individual PathGeometry objetos.

O exemplo a seguir utiliza sintaxe de atributo para criar um StreamGeometry triangular em XAML.

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>

    <Path Data="F0 M10,100 L100,100 100,50Z" 
      StrokeThickness="1" Stroke="Black"/>

  </StackPanel>
</Page>

Para obter mais informações sobre objetos StreamGeometry, consulte Como: Create a Shape Using a StreamGeometry.

Objetos DrawingVisual

O objeto DrawingVisual é uma classe leve para desenhos que é utilizada para renderizar formas, imagens, ou texto. Esta classe é considerada leve porque não fornece layout ou manipulação de eventos, o que melhora o seu desempenho. Por este motivo, os desenhos são ideais para planos de fundo e clip art. Para obter mais informações, consulte Using DrawingVisual Objects.

Imagens

Imagens WPF fornecem+ uma melhoria significativa sobre os recursos de imagem em versões anteriores do Windows. Recursos de imagens, como exibir um bitmap ou usar uma imagem em um controle comum foram primeiramente tratados pelo Microsoft Windows Graphics Device Interface (GDI) ou pela interface de programação de aplicativo (API) do Microsoft Windows GDI+. Esses APIs forneceram funcionalidade básica de imagens, mas não tinham os recursos, como suporte para extensibilidade de codec e suporte de imagens de alta fidelidade. WPF Imaging API foi remodelado para superar os defeitos do GDI e GDI+ e fornecer um novo conjunto de APIs para exibir e usar imagens em seus aplicativos.

Ao usar imagens, considere as seguintes recomendações para obter um melhor desempenho:

  • Se seu aplicativo requer que você exiba imagens em miniatura, considere a possibilidade de criar uma versão de tamanho reduzido da imagem. Por padrão, WPF carrega a imagem e a decodifica para seu tamanho máximo. Se desejar somente uma versão em miniatura da imagem, WPF desnecessários decodifica a imagem ao seu tamanho máximo e, em seguida, a redimensiona até um tamanho da miniatura. Para evitar essa sobrecarga desnecessária, pode-se tanto solicitar WPF para decodificar a imagem a um tamanho miniatura, ou solicitar WPF para carregar uma imagem em tamanho miniatura.

  • Sempre decodifique a imagem para o tamanho desejado e não para o tamanho padrão. Conforme mencionado acima, solicite um WPF para decodificar a imagem para um tamanho desejado e não para o tamanho total padrão. Não só o conjunto de trabalho do aplicativo será reduzido, mas também a velocidade de execução.

  • Se possível, combine as imagens em uma única imagem, como uma tira de filme composta de várias imagens.

  • Para obter mais informações, consulte Visão geral sobre imagens.

Modo de Dimensionamento de Bitmap

Ao animar a dimensão de qualquer bitmap, o algoritmo padrão de reamostragem de imagens de alta qualidade por vezes pode consumir recursos de sistema suficientes para causar degradação da taxa de quadros, efetivamente causando o travamento de animações. Definindo o BitmapScalingMode propriedade das RenderOptions objeto para LowQuality Você pode criar uma animação mais suave ao dimensionar um bitmap. LowQuality modo informa o WPF mecanismo de renderização para comutador de um algoritmo de qualidade otimizado para um algoritmo de velocidade otimizada durante o renderização de imagens.

O exemplo a seguir mostra como definir o BitmapScalingMode como um objeto de imagem.

// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);

Dica para Armazenamento em Cache

Por padrão, WPF não armazena em cache o conteúdo renderizado de objetos TileBrush, como DrawingBrush e VisualBrush. Em cenários estáticos onde nem o conteúdo nem o uso de TileBrush na cena está mudando, isso faz sentido, já que ele economiza memória de vídeo. Não faz tanto sentido quando um TileBrush com conteúdo estático é usado em uma forma não estática — por exemplo, quando um DrawingBrush estático ou VisualBrush é mapeado para a superfície de um objeto 3D que gira. O comportamento padrão de WPF é renderizar novamente todo o conteúdo de DrawingBrush ou VisualBrush para cada quadro, mesmo que o conteúdo não se altere.

Definindo a propriedade CachingHint do objeto RenderOptions como Cache é possível aumentar o desempenho usando versões em cache dos objetos de pincel lado a lado.

Os valores de propriedade CacheInvalidationThresholdMinimum e CacheInvalidationThresholdMaximum são valores de tamanho relativo que determinam quando o objeto TileBrush deve ser regenerado devido a alterações nas dimensões. Por exemplo, definindo a propriedade CacheInvalidationThresholdMaximum como 2.0, o cache para o TileBrush somente precisa ser regenerado quando seu tamanho excede duas vezes o tamanho do cache atual.

O exemplo a seguir mostra como usar a opção de dica de cache para um DrawingBrush.

// Set the minimum and maximum relative sizes for regenerating the tiled brush.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);

// The tiled brush will be regenerated when the size is
//   0.5x, 0.25x (and so forth)
// and
//   2x, 4x, 8x (and so forth)
// of the original size.

// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);

Consulte também

Conceitos

Optimizing WPF Application Performance

Planejando para desempenho de aplicativos

Otimizando o desempenho: Levando vantagens de hardware

Otimizando o desempenho: Layout and Design

Otimizando o desempenho: Comportamento de objeto

Otimizando o desempenho: Recursos do aplicativo

Otimizando o desempenho: Texto

Otimizando o desempenho: Ligação de Dados

Otimizando o desempenho: Outras recomendações

Ferramentas de Desempenho e Recursos do WPF

Dicas e truques de animação