Os painéis mencionados são painéis de layout, portanto, uma breve visão geral do sistema de layout sugere que provavelmente não será apenas uma lista simples dos painéis mais eficientes, mas como você usa os painéis que têm o maior efeito na eficiência e no desempenho.
LayoutSystem_Overview :
Na sua forma mais simples, o layout é um sistema recursivo que leva a que um elemento seja dimensionado, posicionado e desenhado. Mais especificamente, o layout descreve o processo de medir e organizar os membros da coleção Children de um elemento Panel. O layout é um processo intensivo. Quanto maior a coleção Children, maior o número de cálculos que devem ser feitos. A complexidade também pode ser introduzida com base no comportamento do layout definido pelo elemento Panel que possui a coleção. Um painel relativamente simples, como o Canvas, pode ter um desempenho significativamente melhor do que um painel mais complexo, como o Grid.
Cada vez que um UIElement filho muda de posição, ele pode acionar uma nova passagem pelo sistema de layout. Portanto, é importante entender os eventos que podem invocar o sistema de layout, pois invocações desnecessárias podem levar a um desempenho ruim do aplicativo. A seguir, descreve o processo que ocorre quando o sistema de layout é chamado.
1. Um UIElement filho inicia o processo de layout, primeiro medindo suas propriedades principais.
2. As propriedades de dimensionamento definidas no FrameworkElement são avaliadas, como Largura, Altura e Margem.
3. A lógica específica do painel é aplicada, como direção da doca ou orientação de empilhamento.
4. O conteúdo é organizado após todas as crianças terem sido medidas.
5. A coleção Children é desenhada na tela.
6. O processo é chamado novamente se Filhos adicionais forem adicionados à coleção, um LayoutTransform for aplicado ou o método UpdateLayout for chamado.
Consulte LayoutSystem_Measure_Arrange para obter mais informações sobre a medição e organização de crianças.
LayoutSystem_Performance :
Layout é um processo recursivo. Cada elemento filho em uma coleção Children é processado durante cada chamada do sistema de layout. Como resultado, o acionamento do sistema de layout deve ser evitado quando não for necessário. As considerações a seguir podem ajudá-lo a obter melhor desempenho.
Esteja ciente de quais alterações no valor da propriedade forçarão uma atualização recursiva pelo sistema de layout.
As propriedades de dependência cujos valores podem causar a inicialização do sistema de layout são marcadas com sinalizadores públicos. AffectsMeasure e AffectsArrange fornecem dicas úteis sobre quais alterações no valor da propriedade forçarão uma atualização recursiva pelo sistema de layout. Em geral, qualquer propriedade que possa afetar o tamanho da caixa delimitadora de um elemento deve ter um sinalizador AffectsMeasure definido como true. Para obter mais informações, consulte Visão geral das propriedades da dependência.
Quando possível, use um RenderTransform em vez de um LayoutTransform.
Um LayoutTransform pode ser uma maneira muito útil de afetar o conteúdo de uma interface do usuário. No entanto, se o efeito da transformação não precisar impactar a posição de outros elementos, é melhor usar um RenderTransform, porque RenderTransform não chama o sistema de layout. LayoutTransform aplica sua transformação e força uma atualização recursiva do layout a considerar a nova posição do elemento afetado.
Evite chamadas desnecessárias para UpdateLayout.
O método UpdateLayout força uma atualização de layout recursiva e geralmente não é necessário. A menos que você tenha certeza de que é necessária uma atualização completa, conte com o sistema de layout para chamar esse método para você.
Ao trabalhar com uma coleção Children grande, considere usar um VirtualizingStackPanel em vez de um StackPanel comum.
Ao virtualizar a coleção filho, o VirtualizingStackPanel mantém apenas objetos na memória que estão atualmente no ViewPort do pai. Como resultado, o desempenho é substancialmente aprimorado na maioria dos cenários.
Otimizando o desempenho: layout e design : este artigo detalha como criar a árvore com eficiência e fornece uma lista simples de painéis com base em sua complexidade
Tela (menos complext = desempenho mais eficiente e melhor)
Rede
Outros painéis (mais complexo = menos eficiente e pior desempenho)
Outras considerações de desempenho a serem observadas : Maneiras de melhorar a velocidade de renderização da interface do usuário WPF
- Coloque tudo em cache. Pincéis, cores, geometrias, textos formatados, glifos. (Por exemplo, temos duas classes: RenderTools e TextCache. O processo de renderização de cada unidade endereça a instância compartilhada de ambas as classes. Portanto, se dois gráficos tiverem o mesmo texto, sua preparação será executada apenas uma vez.)
- Congelar Freezable, se você planeja usá-lo por um longo tempo. Especialmente geometrias. Geometrias não congeladas complexas executam o HitTest extremamente lento.
- Escolha as formas mais rápidas de renderização de cada primitivo. Por exemplo, existem cerca de 6 maneiras de renderizar texto, mas a mais rápida é DrawingContext.DrawGlyphs.
- Ativar reciclagem de contêineres. A virtualização traz muitas melhorias de desempenho, mas os contêineres serão descartados e recriados, esse é o padrão. Mas você pode obter mais desempenho reciclando contêineres configurando VirtualizingStackPanel.VirtualizationMode = "Recycling"
- A partir daqui : não há limite prático para a quantidade de aninhamento que seu aplicativo pode suportar; no entanto, geralmente é melhor limitar seu aplicativo para usar apenas os painéis que são realmente necessários para o layout desejado. Em muitos casos, um elemento Grid pode ser usado em vez de painéis aninhados devido à sua flexibilidade como um contêiner de layout. Isso pode aumentar o desempenho do seu aplicativo, mantendo elementos desnecessários fora da árvore.