Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O WPF fornece uma ampla gama de gráficos 2D e funcionalidades de imagem que podem ser otimizadas para os requisitos da sua aplicação. Este tópico fornece informações sobre otimização de desempenho nessas áreas.
Desenho e formas
O WPF fornece ambos os Drawing objetos e Shape para representar o conteúdo do desenho gráfico. No entanto, Drawing os objetos são construções mais simples do que Shape os objetos e fornecem melhores características de desempenho.
A Shape permite desenhar uma forma gráfica para o ecrã. Como os objetos FrameworkElement são derivados da classe Shape, podem ser usados dentro de painéis e na maioria dos controles.
O WPF oferece várias camadas de acesso a 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 classe Shape. 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.
Existem quatro tipos de Drawing objetos:
GeometryDrawing Desenha uma forma.
ImageDrawing Desenha uma imagem.
GlyphRunDrawing Desenha texto.
DrawingGroup Desenha outros desenhos. Use um grupo de desenho para combinar outros desenhos em um único desenho composto.
O GeometryDrawing objeto é usado para renderizar 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 testes de acerto e recorte. Os 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. Os objetos de geometria 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 pela combinação PathSegmentde objetos 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 gráficos 2D e ambos têm classes concretas semelhantes que derivam deles, por exemplo, EllipseGeometry e Ellipse. No entanto, existem diferenças importantes entre estes dois conjuntos de classes. Por um lado, a classe Geometry carece de algumas das funcionalidades da classe Shape, como a capacidade de se desenhar a si própria. Para desenhar um objeto de geometria, outra classe como DrawingContext, Drawing ou Path (vale a pena notar que um Path é uma Shape) deve ser usada para executar a operação de desenho. As propriedades de renderização, como preenchimento, traçado e espessura do traçado, estão na classe que desenha o objeto de geometria, 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 realmente não precisa dos recursos FrameworkElement para o seu conteúdo gráfico, considere usar os objetos mais leves Drawing.
Para obter mais informações sobre Drawing objetos, consulte Visão geral de objetos de desenho.
Objetos 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 sintaxe de atributo para criar um StreamGeometry triangular 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.
DesenhoObjetos visuais
O DrawingVisual objeto é uma classe de desenho leve que é usada para renderizar formas, imagens ou texto. Esta classe é considerada leve porque não fornece layout ou manipulação de eventos, o que melhora seu desempenho. Por esta razão, os desenhos são ideais para fundos e clip-art. Para obter mais informações, consulte Usando objetos DrawingVisual.
Imagens
A criação de imagens do WPF fornece uma melhoria significativa em relação aos recursos de criação de imagens em versões anteriores do Windows. Os recursos de imagem, como exibir um bitmap ou usar uma imagem em um controle comum, foram manipulados principalmente pela Interface de Dispositivo Gráfico (GDI) do Microsoft Windows ou pela Interface de Programação de Aplicativo (API) GDI+ do Microsoft Windows. Essas APIs forneciam funcionalidade de criação de imagens de linha de base, mas não tinham recursos como suporte para extensibilidade de codec e suporte a imagens de alta fidelidade. As APIs do WPF Imaging foram redesenhadas para superar as deficiências 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 o seu 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 em tamanho real. Se apenas quiser uma versão em miniatura de imagem, o WPF desnecessariamente descodifica a imagem para o seu tamanho total e, em seguida, reduz 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 decodifice a imagem para o tamanho desejado e não para o tamanho padrão. Como 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 seu 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 a Visão Geral da Criação de Imagens .
ModoDeEscalonamentoDeBitmap
Ao animar a escala de qualquer bitmap, o algoritmo padrão de reamostragem de imagem de alta qualidade às vezes pode consumir recursos suficientes do sistema para causar degradação da taxa de atualização de quadros, resultando em intermitência nas animações. Ao definir a BitmapScalingModeRenderOptions propriedade do objeto como LowQuality, você pode criar uma animação mais suave ao dimensionar um bitmap. LowQuality modo instrui o mecanismo de renderização 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 image.
// 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)
Dica de cache
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 onde o conteúdo ou o uso do TileBrush na cena não estão a mudar, isso faz sentido, uma vez que 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 estático DrawingBrush ou VisualBrush é mapeado para a superfície de um objeto 3D em rotação. O comportamento padrão do WPF é re-renderizar todo o conteúdo de DrawingBrush ou VisualBrush para cada quadro, mesmo que o conteúdo não mude.
Ao definir a propriedade do objeto como CachingHint, você pode aumentar o RenderOptionsCache 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 na escala. Por exemplo, ao definir a propriedade CacheInvalidationThresholdMaximum como 2.0, o cache para o TileBrush só precisa ser regenerado quando o seu tamanho exceder o dobro do tamanho do cache atual.
O exemplo a seguir mostra como usar a opção de dica de 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)
Ver também
.NET Desktop feedback