Xamarin Forms - Dicas de desempenho


Neste artigo vou apresentar algumas dicas para melhorar o desempenho de aplicações Xamarin Forms. Elas foram sugeridas por Jason Smith da Xamarin e apresentadas neste vídeo : https://www.youtube.com/watch?v=RZvdql3Ev0E eu apenas extrai e traduzi as dicas.

Dicas de desempenho para aplicações Xamarin Forms por Json Smith.

1 - Dicas Gerais

ATIVE a compilação XAML se você estiver usando código XAML. Ex:  [assembly: XamlCompilation(XamlCompilationOptions.Compile)]

EVITE realizar o Binding quando a atribuição estática for suficiente.

NÃO atribua valores padrão. Fazer isso tem um custo mesmo que você não esteja modificando o valor.

EVITE usar o recurso da transparência.

USE async/await para evitar bloquear a thread principal. (É uma boa prática)

CONSIDERE inflar visões fora da thread principal, mas não se esqueça de adicioná-las à árvore visual na thread principal.

NÃO use a versão genérica do BindableProperty.Create. (use a versão baseada na cadeia de caracteres com operador nameof).
 
PASSE o MessagingCenter ou como método estático ou como método de instância e não como uma expressão lambda.
 
2 - Layout

NÃO use o layout StackLayout para hospedar uma única view filha (child).

NÃO use o layout Grid quando usar um layout StackLayout resolve o seu problema.

NÃO use vários layouts StackLayouts quando um layout Grid for suficiente.

EVITE usar o layout CarouselPage.

NÃO use um ContentView com Padding (preenchimento) apenas para aplicar uma margem à uma view filha (child). Em vez disso, use a propriedade Margin na view filha (a partir do Xamarin.Forms 2.2).

CUIDADO ao utilizar as propriedades Spacing (ColumnSpacing/RowSpacing para o Grid) e Padding. Exemplo:

Ao invés de fazer assim : Faça assim :
<StackLayout>
   <ContentView Padding="10,10,10,5">
       <Label Text="1"/>
   </ContentView>
   <ContentView Padding="10,0,10,5">
      <Label Text="2"/>
   </ContentView>
   <ContentView Padding="10,0,10,0">
      <Label Text="3"/>
   </ContentView>
</StackLayout>
<StackLayout Padding="10" Spacing="5">
    <Label Text="1"/>
    <Label Text="2"/>
    <Label Text="3"/>
</StackLayout>

PREFIRA usar LayoutOptions.Fill ou LayoutOptions.FillAndExpand. Estes são os padrões e não devem ser modificados na maioria das vezes.

PREFIRA usar colunas/linhas de grade de tamanho de estrela (*) em vez de tamanho automático(auto).

NÃO use vários layouts StackLayouts para simular uma grade.

EVITE usar o layout RelativeLayout se possível.

3 - Labels
 
NÃO use várias views Labels quando um única Label resolve o problema (usando spans com FormattedText)

DESATIVE o acondicionamento de etiquetas se possível. Ex:  LineBreakMode = "NoWrap"

NÃO altere o VerticalTextAlignment padrão para etiquetas, a menos que seja necessário. O padrão remove um ciclo inteiro de medição.

PREFIRA usar as propriedades VerticalTextAlignment e HorizontalTextAlignment da Label ao invés de usar VerticalOptions e HorizontalOptions.

EVITE as atualizações esporádicas nas Labels. Se as atualizações forem para vários rótulos, atualize como um lote, se possível.
 
4 - Navegação

AGUARDE os métodos PushAsync e PopAsync. A falha em fazê-lo é prejudicial tanto ao desempenho quanto à exatidão.

EVITE ocultar/mostrar a barra de navegação.

USE o AppCompat backend para o Android. Isso vai melhorar o desempenho e a aparência do aplicativo.

5 - ListViews

NÃO coloque um ListView dentro de um ScrollView. Use as propriedades Header e Footer do ListView.

NÃO use um TableView onde você pode usar um ListView. Hoje, a única razão real para usar um TableView é para configurações de estilo da UI onde praticamente cada célula tem conteúdo exclusivo.

USE ListViewCachingStrategy.RecycleElement quando você puder. Se não está funcionando, descobra o motivo, porque vale a pena.

USE os seletores DataTemplate para facilitar exibições heterogêneas dentro de um único ListView. Não sobrescreva o método OnBindingContextChanged para atualizações.

EVITE passar IEnumerable<T> como uma fonte de dados para ListViews. Em vez disso, tente usar um IList<T>.

NÃO aninhe ListViews. Em vez disso, use grupos dentro de um único ListView. O aninhamento não tem suporte e pode 'quebrar' sua aplicação.

USE HasUnevenRows onde seu ListView tem linhas de tamanhos diferentes. Se o conteúdo da célula for modificado dinamicamente certifique-se de chamar ForceUpdateSize() na célula.
 
6 - Imagens

EVITE ter que reescalonar imagens, isso é custoso.
 
DEFINA Image.IsOpaque como true quando for possível. (e suas imagens forem opacas)
 
CARREGUE as imagens a partir de Content ao invés de Resources.

Verifique o código usado em suas aplicações Xamarin Forms e faça os ajustes indicados para melhorar o seu desempenho.

Espero que essas dicas te ajudem a melhorar o desempenho da sua aplicação Xamarin.

Nota : Na primeira dica, para ativar a compilação XAML, na nova versão do Xamarin, se você usar o código XAML para ocultar o botão da barra de navegação usando - NavigationPage.HasBackButton="False" ,  vai ocorrer um erro em tempo de compilação.

O erro desaparece quando você remove o atributo para ativar a compilação XAML. ( [XamlCompilation(XamlCompilationOptions.Compile)])

Referências:


José Carlos Macoratti