SlideShare una empresa de Scribd logo
Trucos y consejos rendimiento Xamarin.Forms
Visual Studio Technologies & Windows
Platform Development MVP
Xamarin MVP
Software Developer Plain Concepts
• Blog: http://geeks.ms/blogs/jsuarez
• Email: javiersuarezruiz@hotmail.com
• Twitter: @jsuarezruiz
Trucos y consejos rendimiento Xamarin.Forms
Base de código C# compartido
100% de acceso a APIs nativas
Alto rendimiento
iOS C# UI Windows C# UIAndroid C# UI
Código compartido C#
Interfaces dependientes de código
nativo
Más código compartido. UI XAML o C#
Data Binding & MVVM
Abstracciones (Navegación, etc.)
iOS C# UI Windows C# UIAndroid C# UI
Código compartido C#
Rendimiento < Xamarin.Classic
UI Compartida
• Hay que tener en cuenta la capa de abstracción.
• No se puede desarrollar absolutamente todo sin
pensar en que hay “debajo”.
• Hay que utilizar los controles adecuados en cada caso.
• El árbol visual debe ser parte de nuestra
responsabilidad.
• A veces es necesario código nativo en forma de
Cunstom Renderers o Effects.
XamlC
Si defines la interfaz de usuario de la aplicación Xamarin.Forms con XAML tienes la
opción de utilizar XamlCompilationOptions.
Cuenta con dos valores:
• Compile.
• Acelera la carga de elementos visuales.
• Reduce el tamaño del paquete.
• La compilación (AOT) es más larga.
• Skip.
• Valor por defecto para mantener retocompatibilidad.
• No hay validación en tiempo de ejecución de XAML.
• Xamarin.Forms
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
Detalles:
 TipCalc
 Tiempo calculado con InitializeComponent().
 Tiempo medio de 5 medidas.
 Oneplus 3 con Android 7.1 Nougat.
Android
• Skip 730,4 ms
• Compile 290,4 ms
Xamarin.Forms
DEMODEMODEMO
XamlC, pruebas de rendimiento
Bindings
View
ViewModel
Model
get/set
Propiedades
Comandos
Notifica
cambios
C#
Models
View
View
ViewModel
ViewModel
Model
Model
Cross Platform
• Binding es una características incluida en Xamarin.Forms.
• Permite crear asociaciones entre una Fuente y un destino.
• Permite aplicar MVVM descoplando Modelo y Vista
interponiendo una capa intermedia, la ViewModel.
Propiedad pública BindableProperty
Source TargetBinding
OneWay
TwoWay
OneWayToSource
public abstract class BindableObject : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
//...
}
“No enlaces cosas que se pueden establecer de forma estática”
Jason Smith - Evolve 2016
DEMODEMODEMO
“Midiendo” Bindinds
View
• Xamarin.Forms
• Una View es un elemento de bajo nivel
que representa un nodo en el árbol
visual.
• Toda View cuenta con una serie de
propiedades y eventos.
• Ejemplos: Label, Button, etc.
La creación de una View en Xamarin.Forms se
divide en dos fases:
• Inflating: Instanciar la vista.
• Rendering: Añadir al árbol visual.
public MainView()
{
var stackLayout = new StackLayout();
stackLayout.Children.Add(new Button()
{
Text = «Click me!"
});
//...
}
public MainView()
{
//...
Content = stackLayout;
}
• No especificar las propiedades HorizontalOptions y
VerticalOptions con sus valores por defecto. Se
desencadenan diferentes ciclos con cálculos
innecesarios.
• Rendimiento muy superior utilizando TranslationX y
TranslationY en lugar de Margin para posicionar.
• Evitar modificar la Opacity salvo en casos necesarios.
Costoso sobretodo en Android.
Views, entrando en detalle
• Las propiedades bindables VerticalTextAlignment y HorizontalTextAlignment
de tipo TextAlignment están optimizadas para posicionar el contenido del Label.
<Label Text="Testing"
VerticalOptions="Center"
HorizontalOptions="Center"/>
Label Text="Testing"
VerticalTextAlignment="Center"
HorizontalTextAlignment="Center"/>
• A la hora de manejar texto con formato, el control de tipo Label cuenta con la
propiedad bindable FormattedText. Es muchísimo más óptimo que crear un
nuevo Layout con multiples controles de tipo Label.
<StackLayout Orientation="Horizontal">
<Label Text="Hola " TextColor="Red"/>
<Label Text="!" TextColor="Blue"/>
</StackLayout>
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="Hola " ForegroundColor="Red"/>
<Span Text="!" ForegroundColor="Blue" />
</FormattedString>
</Label.FormattedText>
</Label>
• Es más óptimo utilizar un ImageSource de una
imagen desde el sistema de archivos en lugar del
archivo de recursos.
<Image
Source="resource.png"/>
<Image>
<Image.Source>
<FileImageSource File="file.png"/>
</Image.Source>
</Image>
• Desactivar la opacidad.
• Transformaciones y reducción de tamaño preferable
desde el lado del servidor.
<Image IsOpaque="False"/>
ListView
• Salto cualitativo con Xamarin.Forms 2.0 donde se
añadieron opciones como la reutilización de celdas.
• La reutilización de celdas viene definida por la
propiedad ListViewCachingStrategy que cuenta con
dos posibles valores:
• RecycleElement
• RetainElement
<ListView CachingStrategy="RecycleElement"/>
• El ListView mantiene un grupo de celdas de iguales
dimensiones con el tamaño de la ventana, lo que se
conoce como reutilización de celdas.
• Opción idónea en una enorme variedad de casos pero
no siempre. Por ejemplo, se pueden tener problemas si
se utiliza DataTemplateSelector.
• Es el valor por defecto para garantizar la
compatibilidad con versions anteriores de
Xamarin.Forms.
• El ListView crea una nueva celda por cada element de
la lista.
• En determinadas ocasiones se requiere contenido
adicional al ListView en la parte superior y/o inferior. Es
recomendable utilizar las propiedades
HeaderTemplate y FooterTemplate para ello.
• Envolver al control ListView en un ScrollView rompe
la virtualización!
<ScrollView>
<StackLayout>
<Label Text="Header" />
<ListView />
<Label Text="Footer" />
</StackLayout>
</ScrollView>
<ListView Header="Header" Footer="Footer">
<ListView.HeaderTemplate>
<DataTemplate>
<Label Text="{Binding .}" />
</DataTemplate>
</ListView.HeaderTemplate>
<ListView.FooterTemplate>
<DataTemplate>
<Label Text="{Binding .}" />
</DataTemplate>
</ListView.FooterTemplate>
</ListView>
• Se recomiendo utilizer IList<T> como ItemsSource en
lugar de IEnumerable.
• Si se utiliza RecycleElemement, se aumenta el
rendimiento eliminando el Binding de la celda y
utilizano OnBindingContextChanged.
• No uses un TableView si puedes utilizar un ListView.
DEMODEMODEMO
Sacando rendimiento a un
ListView
Layout
• Un Layout representa un nodo en el árbol
visual.
• Un Layout cuenta con propiedades y eventos
que permiten definer su comportamiento.
• Es el responsible de gestionar la ubicación y
el tamaño de nodos secundarios.
• Ejemplos: StackLayout, Grid, etc.
Trucos y consejos rendimiento Xamarin.Forms
La creación de un Layout en Xamarin.Forms pasa por
dos fases diferentes:
• Ciclo de invalidación: En el árbol visual, el ciclo de
invalidación es el proceso de notificación
recursivamente hacia el nodo padre.
• Ciclo de Layout: Tras invalidar, se procede a la
reorganización de elementos marcados como
“invalidados”.
SiNo
• La invalidación de un Layout puede lanzarse por
diferentes motivos. Cada motive viene indicado en el
enumerado InvalidationTrigger.
public enum InvalidationTrigger {
Undefined = 0,
MeasureChanged = 1 << 0,
HorizontalOptionsChanged = 1 << 1,
VerticalOptionsChanged = 1 << 2,
SizeRequestChanged = 1 << 3,
RendererReady = 1 << 4,
MarginChanged = 1 << 5
}
NoSi
Por cada hijo
Layout.Children
• El ciclo de Layout termina con la llamada a
Layout() del ultimo elemento.
• A diferencia del ciclo de validación, no es
possible controlar el ciclo de Layout.
El Grid organiza los elementos hijos en filas y
columnas.
Permite crear estructuras complejas sin necesidad
de grandes anidaciones.
El tamaño de cada fila y columna es importante, y
afecta al rendimiento. Hay que cuidar la
utilización de celdas y filas.
El Grid organiza los elementos hijos en filas y columnas.
La invalidación de una de las View hijas provoca la
invalidación en cadena del árbol visual de la rejilla.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Label
Grid.Row="1"
Text="Button 2"/>
</Grid>
El Grid puede organizar los elementos con tamaño
proporcional a la View. El Grid ignora cualquier
notificación de invalidación de sus hijos.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Button
Grid.Row="1"
Text="Button 2"/>
</Grid>
El Grid puede organizar los elementos con tamaño fijo. El
Grid ignora cualquier notificación de invalidación de sus
hijos.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Button
Grid.Row="1"
Text="Button 2"/>
</Grid>
El StackLayout organiza los elementos hijos una
sóla fila o columna.
Ideal para la creación sencilla y de forma rápida
de forma secuencial.
CUIDADO!, puede llevar a la anidación excesiva.
El StackLayout organiza los elementos hijos una
sóla fila o columna.
La invalidación de un View hijo provoca la
invalidación en cadena en el árbol visual hasta el
StackLayout.
<StackLayout>
<Button
Text="Button 1"/>
<Button
Text="Button 2"/>
</StackLayout>
” No uses un StackLayout para un único hijo
No uses un Grid cuando el StackLayout hace el trabajo
No uses varios StackLayout cuando un Grid cumple ”
Jason Smith - Evolve 2016
El RelativeLayout organiza los elementos hijos en
base a relaciones entre los diferentes elementos y
el contenedor.
Ideal cuando el tamaño o el posicionamiento dbe
ser dinámico y adaptarse a diferentes
condiciones.
Rendimiento bajo. Alto consume de CPU.
DEMODEMODEMO
Pruebas con Layout
Fast Renderers
Hablamos de cambios realizados en Xamarin.Forms con
el objetivo de reducir a mínimos de operaciones y
cálculos a realizar para renderizar el control y gestionar
su tamaño y posición.
OnLayout();
OnLayout();
ViewRenderer
MeasureAndLayout();
ViewRenderer
OnLayout();
ViewElementRenderer
UpdateLayout();
LabelRenderer
OnLayout();
OnLayout();
ViewRenderer
DEMODEMODEMO
Pruebas con Fast Renderers
Detalles:
 Tiempo calculado con InitializeComponent().
 Tiempo medio de 5 medidas.
 Oneplus 3 con Android 7.1 Nougat.
Android
• No Fast Renderers 946,5 ms
• Fast Rederers 708,6 ms
Xamarin.Forms
Preguntas y respuestas.
¿Dudas?
&
• Muchos de los puntos vistos os daran
pequeñas mejoras en el rendimiento. No
hay “líneas mágicas”, hablamos de un “suma
y sigue”.
• Cambio a cambio si se consiguen
resultados.
• Usa XamlC siempre que puedas!
• Deja los valores que vienen por defecto.
• Utiliza reutilización de celdas en ListView siempre que
puedas.
• Si no son necesarias las transparencias, no las uses. No uses
un StackLayout para un único hijo
• No uses un Grid cuando el StackLayout hace el trabajo
• No uses varios StackLayout cuando un Grid cumple.
• No enlaces valores que no son necesarios.
• Cuida el árbol visual, es parte de tu responsabilidad.
• Nos llegarán FastRenderers que reducen el número de
cálculos necesarios para gestionar Renderers.

Más contenido relacionado

PPTX
dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
PPTX
Extendiendo Xamarin.Forms
PPTX
dotNetMálaga - Taller Xamarin
PPTX
Xamarin Dev Days - Introducción a Xamarin
PPTX
Microsoft Tech Summit - Taller Xamarin
PPTX
Xamarin Dev Days Madrid - Xamarin.Forms
PPTX
Servicios Xamarin
PPTX
Xamarin Dev Days Málaga 2017 - Apps conectadas con Azure
dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
Extendiendo Xamarin.Forms
dotNetMálaga - Taller Xamarin
Xamarin Dev Days - Introducción a Xamarin
Microsoft Tech Summit - Taller Xamarin
Xamarin Dev Days Madrid - Xamarin.Forms
Servicios Xamarin
Xamarin Dev Days Málaga 2017 - Apps conectadas con Azure

La actualidad más candente (20)

PPTX
Integración Continua con Apps Xamarin
PPTX
Interfaces nativas Cross-Platform con Xamarin.Forms
PPTX
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
PPTX
Novedades Xamarin.Forms //BUILD 2017
PPTX
PUE DAY 2017: Introducción a Xamarin
PPTX
Xamarin Dev Days Madrid - Taller Xamarin
PPTX
Introducción a Xamarin utilizando MVVMCross
PPTX
re-Connect Madrid: Novedades Xamarin
PPTX
Windows 10: Hel10 World! - Novedades XAML
PPTX
Introducción a Xamarin.Forms
PPTX
Visual Studio 2017 Launch Event Sevilla
PPTX
SVQXDG - Introducción a Embeddinator-4000
PPTX
Codemotion 2015: UI Tests, Test Cloud y CI con Apps Xamarin
PPTX
Xamarin REvolve 2016
PPTX
Introducción a Xamarin
PPTX
Reconnect(); Sevilla - Keynote
PPTX
Testing de Apps Xamarin
PPTX
DotNet 2019: Optimizando Apps con Xamarin.Forms
PPTX
Taller Xamarin Monkey Conf 2018
PPTX
Monkey Conf 2018: Conociendo Xamarin.Forms Shell
Integración Continua con Apps Xamarin
Interfaces nativas Cross-Platform con Xamarin.Forms
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
Novedades Xamarin.Forms //BUILD 2017
PUE DAY 2017: Introducción a Xamarin
Xamarin Dev Days Madrid - Taller Xamarin
Introducción a Xamarin utilizando MVVMCross
re-Connect Madrid: Novedades Xamarin
Windows 10: Hel10 World! - Novedades XAML
Introducción a Xamarin.Forms
Visual Studio 2017 Launch Event Sevilla
SVQXDG - Introducción a Embeddinator-4000
Codemotion 2015: UI Tests, Test Cloud y CI con Apps Xamarin
Xamarin REvolve 2016
Introducción a Xamarin
Reconnect(); Sevilla - Keynote
Testing de Apps Xamarin
DotNet 2019: Optimizando Apps con Xamarin.Forms
Taller Xamarin Monkey Conf 2018
Monkey Conf 2018: Conociendo Xamarin.Forms Shell
Publicidad

Similar a Trucos y consejos rendimiento Xamarin.Forms (20)

PPTX
DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
PDF
Android Superstar - Buenas Prácticas
PDF
Grails: Framework para el desarrollo de aplicaciones Web No 2
PPTX
Introducción a Knockout
PDF
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
PPTX
NET MAUI Terasoft.pptx
PDF
(30/04) TECHnight MSDN - Desarrollo de aplicaciones Silverlight y novedades e...
PDF
Angular js
PPTX
Introducción a Backbone
KEY
Rails intro
PDF
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
PDF
Esencia de web components
PDF
MODELO VISTA CONTROLADOR EN PHP
PDF
Esencia de Web Components
PPTX
S5 android ui
PPTX
Desarrollo de aplicaciones con wpf
PDF
Ruby On Rails Intro
PPTX
Novedades Xamarin.Forms 2
PDF
Gwt III - Avanzado
PPTX
Taller de Grails
DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
Android Superstar - Buenas Prácticas
Grails: Framework para el desarrollo de aplicaciones Web No 2
Introducción a Knockout
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
NET MAUI Terasoft.pptx
(30/04) TECHnight MSDN - Desarrollo de aplicaciones Silverlight y novedades e...
Angular js
Introducción a Backbone
Rails intro
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Esencia de web components
MODELO VISTA CONTROLADOR EN PHP
Esencia de Web Components
S5 android ui
Desarrollo de aplicaciones con wpf
Ruby On Rails Intro
Novedades Xamarin.Forms 2
Gwt III - Avanzado
Taller de Grails
Publicidad

Más de Javier Suárez Ruiz (20)

PPTX
Cape Town MS Developer User Group: Xamarin Community Toolkit
PPTX
DotNetDom: El futuro de Xamarin
PPTX
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.Forms
PPTX
Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....
PPTX
Monkey Conf 2020: .NET MAUI Handlers
PPTX
Creando controles para Xamarin.Forms
PPTX
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
PPTX
Crear interfaces de usuario atractivas con Xamarin.Forms
PPTX
#XamarinUIJuly Summary
PPTX
.Net Conf Sevilla 2018
PPTX
Analizando interfaces de usuario avanzadas con Xamarin.Forms
PPTX
OpenSouthCode 2018: Taller Xamarin
PPTX
DotNet2018: Xamarin.Forms Everywhere!
PPTX
Novedades Xamarin 3.0 Preview
PPTX
Desarrollo Xamarin, más allá del desarrollo
PPTX
Introducción a Xamarin.Forms
PPTX
Introducción a Xamarin
PPTX
Aumento de productividad, herramientas Xamarin
PPTX
Plain Concepts Tech Day: Desarrollo de aplicaciones multiplataforma con Xamarin
PPTX
Novedades Xamarin Connect(); 2017
Cape Town MS Developer User Group: Xamarin Community Toolkit
DotNetDom: El futuro de Xamarin
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.Forms
Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....
Monkey Conf 2020: .NET MAUI Handlers
Creando controles para Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
Crear interfaces de usuario atractivas con Xamarin.Forms
#XamarinUIJuly Summary
.Net Conf Sevilla 2018
Analizando interfaces de usuario avanzadas con Xamarin.Forms
OpenSouthCode 2018: Taller Xamarin
DotNet2018: Xamarin.Forms Everywhere!
Novedades Xamarin 3.0 Preview
Desarrollo Xamarin, más allá del desarrollo
Introducción a Xamarin.Forms
Introducción a Xamarin
Aumento de productividad, herramientas Xamarin
Plain Concepts Tech Day: Desarrollo de aplicaciones multiplataforma con Xamarin
Novedades Xamarin Connect(); 2017

Último (20)

PDF
Estrategia de Apoyo de Daylin Castaño (5).pdf
PPTX
Historia Inteligencia Artificial Ana Romero.pptx
PDF
informe_fichas1y2_corregido.docx (2) (1).pdf
PDF
Taller tecnológico Michelle lobo Velasquez
PPTX
Propuesta BKP servidores con Acronis1.pptx
PDF
NREN - red nacional de investigacion y educacion en LATAM y Europa: Caracteri...
PPTX
la-historia-de-la-medicina Edna Silva.pptx
PPTX
El uso de las TIC en la vida cotidiana..
PDF
Documental Beyond the Code (Dossier Presentación - 2.0)
PDF
Teoría de estadística descriptiva y aplicaciones .pdf
DOCX
TRABAJO GRUPAL (5) (1).docxjesjssjsjjskss
PPTX
modulo seguimiento 1 para iniciantes del
PPTX
CLAASIFICACIÓN DE LOS ROBOTS POR UTILIDAD
PDF
PRESENTACIÓN GENERAL MIPIG - MODELO INTEGRADO DE PLANEACIÓN
PDF
MANUAL de recursos humanos para ODOO.pdf
DOCX
Guía 5. Test de orientación Vocacional 2.docx
PPT
Protocolos de seguridad y mecanismos encriptación
PPTX
ccna: redes de nat ipv4 stharlling cande
PPTX
Presentacion de Alba Curso Auditores Internos ISO 19011
DOCX
TRABAJO GRUPAL (5) (1).docxjsjsjskskksksk
Estrategia de Apoyo de Daylin Castaño (5).pdf
Historia Inteligencia Artificial Ana Romero.pptx
informe_fichas1y2_corregido.docx (2) (1).pdf
Taller tecnológico Michelle lobo Velasquez
Propuesta BKP servidores con Acronis1.pptx
NREN - red nacional de investigacion y educacion en LATAM y Europa: Caracteri...
la-historia-de-la-medicina Edna Silva.pptx
El uso de las TIC en la vida cotidiana..
Documental Beyond the Code (Dossier Presentación - 2.0)
Teoría de estadística descriptiva y aplicaciones .pdf
TRABAJO GRUPAL (5) (1).docxjesjssjsjjskss
modulo seguimiento 1 para iniciantes del
CLAASIFICACIÓN DE LOS ROBOTS POR UTILIDAD
PRESENTACIÓN GENERAL MIPIG - MODELO INTEGRADO DE PLANEACIÓN
MANUAL de recursos humanos para ODOO.pdf
Guía 5. Test de orientación Vocacional 2.docx
Protocolos de seguridad y mecanismos encriptación
ccna: redes de nat ipv4 stharlling cande
Presentacion de Alba Curso Auditores Internos ISO 19011
TRABAJO GRUPAL (5) (1).docxjsjsjskskksksk

Trucos y consejos rendimiento Xamarin.Forms

  • 2. Visual Studio Technologies & Windows Platform Development MVP Xamarin MVP Software Developer Plain Concepts • Blog: http://geeks.ms/blogs/jsuarez • Email: javiersuarezruiz@hotmail.com • Twitter: @jsuarezruiz
  • 4. Base de código C# compartido 100% de acceso a APIs nativas Alto rendimiento iOS C# UI Windows C# UIAndroid C# UI Código compartido C# Interfaces dependientes de código nativo
  • 5. Más código compartido. UI XAML o C# Data Binding & MVVM Abstracciones (Navegación, etc.) iOS C# UI Windows C# UIAndroid C# UI Código compartido C# Rendimiento < Xamarin.Classic UI Compartida
  • 6. • Hay que tener en cuenta la capa de abstracción. • No se puede desarrollar absolutamente todo sin pensar en que hay “debajo”. • Hay que utilizar los controles adecuados en cada caso. • El árbol visual debe ser parte de nuestra responsabilidad. • A veces es necesario código nativo en forma de Cunstom Renderers o Effects.
  • 8. Si defines la interfaz de usuario de la aplicación Xamarin.Forms con XAML tienes la opción de utilizar XamlCompilationOptions. Cuenta con dos valores: • Compile. • Acelera la carga de elementos visuales. • Reduce el tamaño del paquete. • La compilación (AOT) es más larga. • Skip. • Valor por defecto para mantener retocompatibilidad. • No hay validación en tiempo de ejecución de XAML.
  • 10. Detalles:  TipCalc  Tiempo calculado con InitializeComponent().  Tiempo medio de 5 medidas.  Oneplus 3 con Android 7.1 Nougat. Android • Skip 730,4 ms • Compile 290,4 ms Xamarin.Forms
  • 14. • Binding es una características incluida en Xamarin.Forms. • Permite crear asociaciones entre una Fuente y un destino. • Permite aplicar MVVM descoplando Modelo y Vista interponiendo una capa intermedia, la ViewModel. Propiedad pública BindableProperty Source TargetBinding OneWay TwoWay OneWayToSource
  • 15. public abstract class BindableObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } //... } “No enlaces cosas que se pueden establecer de forma estática” Jason Smith - Evolve 2016
  • 17. View
  • 18. • Xamarin.Forms • Una View es un elemento de bajo nivel que representa un nodo en el árbol visual. • Toda View cuenta con una serie de propiedades y eventos. • Ejemplos: Label, Button, etc.
  • 19. La creación de una View en Xamarin.Forms se divide en dos fases: • Inflating: Instanciar la vista. • Rendering: Añadir al árbol visual.
  • 20. public MainView() { var stackLayout = new StackLayout(); stackLayout.Children.Add(new Button() { Text = «Click me!" }); //... }
  • 22. • No especificar las propiedades HorizontalOptions y VerticalOptions con sus valores por defecto. Se desencadenan diferentes ciclos con cálculos innecesarios. • Rendimiento muy superior utilizando TranslationX y TranslationY en lugar de Margin para posicionar. • Evitar modificar la Opacity salvo en casos necesarios. Costoso sobretodo en Android.
  • 24. • Las propiedades bindables VerticalTextAlignment y HorizontalTextAlignment de tipo TextAlignment están optimizadas para posicionar el contenido del Label. <Label Text="Testing" VerticalOptions="Center" HorizontalOptions="Center"/> Label Text="Testing" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
  • 25. • A la hora de manejar texto con formato, el control de tipo Label cuenta con la propiedad bindable FormattedText. Es muchísimo más óptimo que crear un nuevo Layout con multiples controles de tipo Label. <StackLayout Orientation="Horizontal"> <Label Text="Hola " TextColor="Red"/> <Label Text="!" TextColor="Blue"/> </StackLayout> <Label> <Label.FormattedText> <FormattedString> <Span Text="Hola " ForegroundColor="Red"/> <Span Text="!" ForegroundColor="Blue" /> </FormattedString> </Label.FormattedText> </Label>
  • 26. • Es más óptimo utilizar un ImageSource de una imagen desde el sistema de archivos en lugar del archivo de recursos. <Image Source="resource.png"/> <Image> <Image.Source> <FileImageSource File="file.png"/> </Image.Source> </Image>
  • 27. • Desactivar la opacidad. • Transformaciones y reducción de tamaño preferable desde el lado del servidor. <Image IsOpaque="False"/>
  • 29. • Salto cualitativo con Xamarin.Forms 2.0 donde se añadieron opciones como la reutilización de celdas. • La reutilización de celdas viene definida por la propiedad ListViewCachingStrategy que cuenta con dos posibles valores: • RecycleElement • RetainElement <ListView CachingStrategy="RecycleElement"/>
  • 30. • El ListView mantiene un grupo de celdas de iguales dimensiones con el tamaño de la ventana, lo que se conoce como reutilización de celdas. • Opción idónea en una enorme variedad de casos pero no siempre. Por ejemplo, se pueden tener problemas si se utiliza DataTemplateSelector.
  • 31. • Es el valor por defecto para garantizar la compatibilidad con versions anteriores de Xamarin.Forms. • El ListView crea una nueva celda por cada element de la lista.
  • 32. • En determinadas ocasiones se requiere contenido adicional al ListView en la parte superior y/o inferior. Es recomendable utilizar las propiedades HeaderTemplate y FooterTemplate para ello. • Envolver al control ListView en un ScrollView rompe la virtualización!
  • 33. <ScrollView> <StackLayout> <Label Text="Header" /> <ListView /> <Label Text="Footer" /> </StackLayout> </ScrollView> <ListView Header="Header" Footer="Footer"> <ListView.HeaderTemplate> <DataTemplate> <Label Text="{Binding .}" /> </DataTemplate> </ListView.HeaderTemplate> <ListView.FooterTemplate> <DataTemplate> <Label Text="{Binding .}" /> </DataTemplate> </ListView.FooterTemplate> </ListView>
  • 34. • Se recomiendo utilizer IList<T> como ItemsSource en lugar de IEnumerable. • Si se utiliza RecycleElemement, se aumenta el rendimiento eliminando el Binding de la celda y utilizano OnBindingContextChanged.
  • 35. • No uses un TableView si puedes utilizar un ListView.
  • 38. • Un Layout representa un nodo en el árbol visual. • Un Layout cuenta con propiedades y eventos que permiten definer su comportamiento. • Es el responsible de gestionar la ubicación y el tamaño de nodos secundarios. • Ejemplos: StackLayout, Grid, etc.
  • 40. La creación de un Layout en Xamarin.Forms pasa por dos fases diferentes: • Ciclo de invalidación: En el árbol visual, el ciclo de invalidación es el proceso de notificación recursivamente hacia el nodo padre. • Ciclo de Layout: Tras invalidar, se procede a la reorganización de elementos marcados como “invalidados”.
  • 41. SiNo
  • 42. • La invalidación de un Layout puede lanzarse por diferentes motivos. Cada motive viene indicado en el enumerado InvalidationTrigger. public enum InvalidationTrigger { Undefined = 0, MeasureChanged = 1 << 0, HorizontalOptionsChanged = 1 << 1, VerticalOptionsChanged = 1 << 2, SizeRequestChanged = 1 << 3, RendererReady = 1 << 4, MarginChanged = 1 << 5 }
  • 44. • El ciclo de Layout termina con la llamada a Layout() del ultimo elemento. • A diferencia del ciclo de validación, no es possible controlar el ciclo de Layout.
  • 45. El Grid organiza los elementos hijos en filas y columnas. Permite crear estructuras complejas sin necesidad de grandes anidaciones. El tamaño de cada fila y columna es importante, y afecta al rendimiento. Hay que cuidar la utilización de celdas y filas.
  • 46. El Grid organiza los elementos hijos en filas y columnas. La invalidación de una de las View hijas provoca la invalidación en cadena del árbol visual de la rejilla. <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Button Text="Button 1"/> <Label Grid.Row="1" Text="Button 2"/> </Grid>
  • 47. El Grid puede organizar los elementos con tamaño proporcional a la View. El Grid ignora cualquier notificación de invalidación de sus hijos. <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Button Text="Button 1"/> <Button Grid.Row="1" Text="Button 2"/> </Grid>
  • 48. El Grid puede organizar los elementos con tamaño fijo. El Grid ignora cualquier notificación de invalidación de sus hijos. <Grid> <Grid.RowDefinitions> <RowDefinition Height="150"/> <RowDefinition Height="150"/> </Grid.RowDefinitions> <Button Text="Button 1"/> <Button Grid.Row="1" Text="Button 2"/> </Grid>
  • 49. El StackLayout organiza los elementos hijos una sóla fila o columna. Ideal para la creación sencilla y de forma rápida de forma secuencial. CUIDADO!, puede llevar a la anidación excesiva.
  • 50. El StackLayout organiza los elementos hijos una sóla fila o columna. La invalidación de un View hijo provoca la invalidación en cadena en el árbol visual hasta el StackLayout. <StackLayout> <Button Text="Button 1"/> <Button Text="Button 2"/> </StackLayout>
  • 51. ” No uses un StackLayout para un único hijo No uses un Grid cuando el StackLayout hace el trabajo No uses varios StackLayout cuando un Grid cumple ” Jason Smith - Evolve 2016
  • 52. El RelativeLayout organiza los elementos hijos en base a relaciones entre los diferentes elementos y el contenedor. Ideal cuando el tamaño o el posicionamiento dbe ser dinámico y adaptarse a diferentes condiciones. Rendimiento bajo. Alto consume de CPU.
  • 55. Hablamos de cambios realizados en Xamarin.Forms con el objetivo de reducir a mínimos de operaciones y cálculos a realizar para renderizar el control y gestionar su tamaño y posición.
  • 59. Detalles:  Tiempo calculado con InitializeComponent().  Tiempo medio de 5 medidas.  Oneplus 3 con Android 7.1 Nougat. Android • No Fast Renderers 946,5 ms • Fast Rederers 708,6 ms Xamarin.Forms
  • 61. • Muchos de los puntos vistos os daran pequeñas mejoras en el rendimiento. No hay “líneas mágicas”, hablamos de un “suma y sigue”. • Cambio a cambio si se consiguen resultados.
  • 62. • Usa XamlC siempre que puedas! • Deja los valores que vienen por defecto. • Utiliza reutilización de celdas en ListView siempre que puedas. • Si no son necesarias las transparencias, no las uses. No uses un StackLayout para un único hijo • No uses un Grid cuando el StackLayout hace el trabajo • No uses varios StackLayout cuando un Grid cumple.
  • 63. • No enlaces valores que no son necesarios. • Cuida el árbol visual, es parte de tu responsabilidad. • Nos llegarán FastRenderers que reducen el número de cálculos necesarios para gestionar Renderers.

Notas del editor

  • #16: https://www.youtube.com/watch?v=RZvdql3Ev0E
  • #60: https://javiersuarezruiz.wordpress.com/2017/05/08/xamarin-forms-fastrenderers/