Compartilhar via


Otimizando o desempenho: gráficos 2D e imagens

O WPF fornece uma ampla gama de elementos gráficos 2D e funcionalidade de imagem que podem ser otimizadas para seus requisitos de aplicativo. Este tópico fornece informações sobre otimização de desempenho nessas áreas.

Desenho e formas

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

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

O WPF oferece várias camadas de acesso a elementos gráficos e serviços de renderização. Na camada superior, Shape os objetos são fáceis de usar e fornecem muitos recursos úteis, como layout e manipulação de eventos. O WPF fornece vários objetos de forma prontos para uso. Todos os objetos de forma herdam da Shape classe. Os objetos de forma disponíveis incluem Ellipse, Line, Path, , Polygon, Polylinee Rectangle.

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

Há quatro tipos de Drawing objetos:

O GeometryDrawing objeto é usado para renderizar o conteúdo de geometria. A Geometry classe e as classes concretas que derivam dela, como CombinedGeometry, EllipseGeometrye PathGeometry, fornecem um meio para renderizar gráficos 2D e fornecer suporte a teste de clique e recorte. Objetos de geometria podem ser usados para definir a região de um controle, por exemplo, ou para definir a região do clipe a ser aplicada a uma imagem. Objetos geometry podem ser regiões simples, como retângulos e círculos, ou regiões compostas criadas a partir de dois ou mais objetos de geometria. Regiões geométricas mais complexas podem ser criadas combinando PathSegmentobjetos derivados, como ArcSegment, BezierSegmente QuadraticBezierSegment.

Na superfície, a Geometry classe e a Shape classe são semelhantes. Ambos são usados na renderização de elementos gráficos 2D e ambos têm classes concretas semelhantes que derivam deles, por exemplo, EllipseGeometry e Ellipse. No entanto, há diferenças importantes entre esses dois conjuntos de classes. Por exemplo, a Geometry classe não tem algumas das funcionalidades da Shape classe, como a capacidade de desenhar a si mesma. Para desenhar um objeto de geometria, outra classe como DrawingContext, Drawing ou um Path (vale a pena observar que um caminho é uma forma) deve ser usada para executar a operação de desenho. As propriedades de renderização, como preenchimento, traço e espessura do traço, estão na classe que desenha o objeto geometry, enquanto um objeto de forma contém essas propriedades. Uma maneira de pensar nessa diferença é que um objeto de geometria define uma região, por exemplo, um círculo, enquanto um objeto de forma define uma região, define como essa região é preenchida e delineada e participa do sistema de layout.

Como Shape os objetos derivam da FrameworkElement classe, usá-los pode adicionar significativamente mais consumo de memória em seu aplicativo. Se você realmente não precisar dos recursos do seu FrameworkElement conteúdo gráfico, considere usar os objetos de menor peso Drawing.

Para obter mais informações sobre Drawing objetos, consulte Visão geral de objetos de desenho.

Objetos de StreamGeometry

O objeto StreamGeometry é uma alternativa leve ao PathGeometry para criar formas geométricas. Use um StreamGeometry quando precisar descrever uma geometria complexa. StreamGeometry é otimizado para lidar com muitos PathGeometry objetos e tem um desempenho melhor quando comparado ao uso de muitos objetos individuais PathGeometry .

O exemplo a seguir usa a sintaxe de atributo para criar um triangular StreamGeometry em 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 obter mais informações sobre StreamGeometry objetos, consulte Criar uma forma usando um StreamGeometry.

Objetos DrawingVisual

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

Imagens

A imagem do WPF fornece uma melhoria significativa em relação aos recursos de imagem em versões anteriores do Windows. Os recursos de imagem, como exibir um bitmap ou usar uma imagem em um controle comum, foram tratados principalmente pela interface de dispositivo do Microsoft Windows Graphics (GDI) ou pela API (interface de programação de aplicativo) do Microsoft Windows GDI+. Essas APIs forneceram funcionalidade de imagem de linha de base, mas não tinham recursos, como capacidade de extensibilidade de codec e suporte para imagens de alta fidelidade. As APIs de Imagem do WPF foram reprojetadas para superar as deficiências de GDI e GDI+ e fornecem um novo conjunto de APIs para exibir e usar imagens em seus aplicativos.

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

  • Se o aplicativo exigir que você exiba imagens em miniatura, considere a criação de uma versão de tamanho reduzido da imagem. Por padrão, o WPF carrega sua imagem e a decodifica para seu tamanho total. Se você quiser apenas uma versão em miniatura da imagem, o WPF decodificará a imagem de forma desnecessária para seu tamanho total e, em seguida, dimensioná-la para um tamanho de miniatura. Para evitar essa sobrecarga desnecessária, você pode solicitar ao WPF para decodificar a imagem para um tamanho de miniatura ou solicitar que o WPF carregue uma imagem de tamanho de miniatura.

  • Sempre decodificar a imagem para o tamanho desejado e não para o tamanho padrão. Conforme mencionado acima, solicite ao WPF para decodificar sua imagem para um tamanho desejado e não para o tamanho completo padrão. Você reduzirá não apenas o conjunto de trabalho do aplicativo, mas também a velocidade de execução.

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

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

ModoDeEscalonamentoDeBitmap

Ao animar a escala de qualquer bitmap, o algoritmo padrão de reamostragem de imagem de alta qualidade pode, às vezes, consumir recursos suficientes do sistema para causar uma queda na taxa de quadros, efetivamente provocando interrupções nas animações. Ao definir a propriedade BitmapScalingMode do objeto RenderOptions para LowQuality, você pode criar uma animação mais suave ao dimensionar um bitmap. LowQuality O modo orienta o mecanismo de renderização do WPF a alternar de um algoritmo otimizado para qualidade para um algoritmo otimizado para velocidade ao processar imagens.

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

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

CachingHint

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

Ao definir a propriedade CachingHint do objeto RenderOptions como Cache, você pode aumentar o desempenho usando versões armazenadas em cache dos objetos de pincel em bloco.

Os valores das propriedades CacheInvalidationThresholdMinimum e CacheInvalidationThresholdMaximum são de tamanho relativo e determinam quando o objeto TileBrush deve ser regenerado devido a alterações na escala de tamanho. Por exemplo, ao definir a propriedade CacheInvalidationThresholdMaximum como 2,0, o cache TileBrush só precisa ser regenerado quando seu tamanho exceder o dobro do tamanho do cache atual.

O exemplo a seguir mostra como usar a opção de sugestão de armazenamento em cache para um 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 também