SlideShare ist ein Scribd-Unternehmen logo
1 von 73
Downloaden Sie, um offline zu lesen
Optimizando Apps con
Xamarin.Forms
ORGANIZATION
PLATINUM SPONSORS
Thank you!
COLLABORATORS
@jsuarezruiz
javiersuarezruiz@hotmail.com
Trabajo en Microsoft en Visual Studio para macOS.
Coordinador de CartujaDotNet, comunidad .NET de Sevilla y de
SVQXDG, comunidad Xamarin de Sevilla.
Javier Suárez
Senior Software Engineer at Microsoft
Oops!. Problema con
el rendimiento
•Normalmente, el rendimiento es un punto
que se suele tener en cuenta “al final” y “si es
necesario”.
•El objetivo de esta sesión sera que te quedes
con consejos, ideas y factores a tener en
cuenta para que la preocupación por el
rendimiento se traslade durante todo el
desarrollo.
¿Qué vamos a ver?
1.XAMLC
2.Bindings
3.Fast Renderers
4.Images
5.Layouts
6.CollectionView (y ListView)
7.Visual
8.Shell
9.Startup
10.Peticiones Http
11.Otros (IoC, Custom Renderers, etc)
Suma y sigue. No hay
“magia”.
• Vamos a ver una sucesión de ideas y
consejos relacionadas con Xamarin.Forms.
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.
Xamarin Classic
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
Xamarin.Forms
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
A tener en cuenta...
•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 Custom
Renderers o Effects.
Las claves.
Step
VS 2017
15.8
VS 2019 16.0 Diferencia
Primera Build 01:04.20 00:50.13 -21.95%
Incremental Build
(Cambios en
XAML)
00:10.62 00:07.47 -29.66%
Despliegue
(Cambios en
XAML)
00:09.03 00:04.44 -50.83%
SmartHotel Reference App
XAMLC
Compilación de XAML
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.
XAMLC
Compilación de XAML
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
Detalles:
• TipCalc en Android.
• JIT.
• Tiempo calculado
con
InitializeComponent()
.
• Tiempo medio de 5
medidas.
• Oneplus 6.
Bindings
Bindings y MVVM
• Binding es una características incluida en Xamarin.Forms.
• Permite crear asociaciones entre una Fuente y un destino.
• Permite aplicar MVVM desacoplando Modelo y Vista
interponiendo una capa intermedia, la ViewModel.
Propiedad pública
BindableProperty
Source
TargetBinding
OneWay
TwoWay
OneWayToSource
Bindings, el funcionamiento
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
Bindings
Detalles:
• El sistema de Bindings es
rápido, pero tiene un
costo en el rendimiento.
• Los errores de enlace a
datos tienen impacto en el
rendimiento.
• En ocasiones, evitar el
enlace a datos ayuda a
mejorar el rendimiento
(Ejemplo: listado con celda
personalizada).
Fast Renderers
Fast Renderers
Hablamos de cambios realizados en Xamarin.Forms con el
objetivo de reducir a mínimos el número de operaciones y
cálculos a realizar para renderizar el control y gestionar su
tamaño y posición.
¿Qué aporta?
Pre Fast Renderers (Label)
OnLayout();
OnLayout();
ViewRenderer
MeasureAndLayout();
ViewRenderer
OnLayout();
ViewElementRenderer
UpdateLayout();
LabelRenderer
Post Fast Renderers (Label)
OnLayout();
OnLayout();
ViewRenderer
Fast Renderers
Detalles:
• Tiempo de incialización
y creación de la vista.
• Android.
• JIT.
• Tiempo tomado de 5
medidas.
• One Plus 6.
• Se usan por defecto en
Xamarin.Forms 4.0!
Images
Images
Detalles:
• La opción más sencilla y directa
de mejorar la gestión de
imágenes es usando
FFImageLoading.
• GlideX tiene mejor rendimiento
que FFImageLoading en Android.
• Gracias a IImageSourceHandler
se puede personalizar que usar
para la gestión de ImageSource
en cada plataforma. Por ejemplo,
usar FFImageLoading en iOS y
GlideX en Android.
• Se esta trabajando activamente
en mejorar la gestión de
imágenes en Xamarin.Forms.
Reducción en un 15% de media
en el uso de memoria en la v4.0
en comparación a v3.6.
IImageSourceHandler
Desde Xamarin.Forms 2.3.5, tenemos la interfaz IImageSourceHandler. Permite implementar ImageSource en
la plataforma.
Las claves.
public class ImageSourceHandler : IImageSourceHandler
{
public Task<UIImage> LoadImageAsync(
ImageSource imageSource,
CancellationToken cancellationToken = new CancellationToken(),
float scale = 1)
{
return LoadUsingFFImageLoading(
imageSource, cancellationToken);
}
...
} ExportImageSourceHandler
DEMO: Images
Layouts
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.
El ciclo de vida de un Layout
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”.
Ciclo de invalidación
SiNo
Ciclo de Layout
NoSi
Por cada hijo
Layout.Children
Grid
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.
Consejos Grid
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>
Consejos 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>
Consejos 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>
StackLayout
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.
Consejos StackLayout
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>
RelativeLayout
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.
Layouts
Detalles:
• 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.
• RelativeLayout tiene el peor
rendimiento. Alto consumo de
CPU.
• FlexLayout, no es el vencedor en
cuanto a rendimiento aunque
dada su flexibilidad y
rendimiento es una opción
altamente recomendada.
• En caso de posicionar pudiendo
usar posiciones absolutas,
AbsoluteLayout no tiene rival.
CollectionView (&
LisrtView)
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"/>
Consejos ListView
• 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!
Consejos ListView
<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>
Consejos 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.
• Soporta layouts Horizontal/Vertical
• Soporte a multiples columnas/filas de elementos
• Es como una versión moderna de ListView
• No es necesario usar Cells
• Se usan Views y DataTemplates
• Mejora considerable en el rendimiento.
https://github.com/xamarin/Xamarin.Forms/issues/3172
CollectionView
Detalles:
• Media de 5 medidas.
• La gestión de celdas es mucho
más eficiente en
CollectionView, es la clave.
• El consumo de memoria es
inferior al usar CollectionView
con respecto a ListView.
• Los tiempos necesarios para
renderizado de celdas, es más
óptimo en CollectionView.
• Tras medir también el tiempo
de arranque de la App, es
también ligeramente mejor en
CollectionView.
Visual
Actualmente, muchas aplicaciones se ven a nivel estético exactamente
igual en todas las plataformas. En Xamarin.Forms, para conseguir este
resultado, en ocasiones hacen falta Custom Renders o efectos (código
específico de plataforma) para conseguirlo.
Por ese motivo, llega una nueva opción para conseguir la misma interfaz
de usuario en diferentes plataformas sin necesidad de requerir tanto a
Custom Renders o efectos.
Original - Gmail
¿Cómo usar Visual?
FormsMaterial.Init();
<ContentPage Visual=“Material”>
…
</ContentPage>
Los valores posibles de la propiedad Visual:
• Default : indica que la vista debe presentarse mediante el representador predeterminado.
• MatchParent : indica que la vista debe utilizar el representador mismo como su elemento primario directo.
• Material : indica que la vista debe representar con un procesador de material.
Visual
Detalles:
• Media de 5 medidas.
• Todos los renderers de Visual
son Fast Renderers.
• Los renderers de Visual tienen
un rendimiento general mejor
que los de por defecto (salvo el
Entry).
• La gestión de recursos
(eventos, dependencias, etc.)
es mejor en los renderers en
Visual, impacta en el consumo
de memoria. Mejor con Visual.
DEMO: Visual
Shell
Facilita la creación de la estructura de la aplicación
• Un lugar común donde describir la estructura de la
aplicación.
• Servicio de navegación con deep linking.
• Gestión de búsquedas integradas.
• Mejor rendimiento
• Facilitar crear Layouts complejos
• Navegación con Flyout y pestañas
• URL routed navigation, deep linking
• Mejoras en la navegación, gestion de
navegar atrás
• Search handler
• Snackbar
• Bottom Sheet
• Floating Action Button
• Left Bar Button
• Screen segues
• Transiciones de páginas
• Nueva API de gestos
• Además de todo lo que ya era posible
con Xamarin.Forms antes
Shell
Detalles:
• Datos tomados de 5 medidas
en Android.
• Rendimiento mejor en iOS que
en Android.
• Shell tiene un consumo de
memoria medio más bajo.
• El tiempo de arranque es
ligeramente mejor en iOS y a
su ves ligeramente peor en
Android que sin usar Shell.
Startup
Startup
• La opción compilación AOT habilita la compilación Ahead Of Time de los
ensamblados. Cuando esta opción está habilitada, la sobrecarga de inicio
Just-In-Time (JIT) se minimiza al precompilar ensamblados antes del tiempo
de ejecución. El código nativo resultante se incluye en el paquete (APK)
junto con los ensamblados sin compilar. Esto da como resultado un tiempo
de inicio de la aplicación más reducido, pero a costa de tamaños APK más
grandes.
• A costa de tiempos de compilación más lentos, el compilador de
optimización de LLVM debe crear un código compilado más pequeño y
rápido.
Startup (tiempo de arranque)
Detalles:
• AOT reduce casi a la mitad el
tiempo de arranque!.
• AOT incrementa el tamaño del
paquete!.
• La optimización LLVM tiene un
ligero impacto en el tiempo de
arranque, aunque nos ayuda a
tener un paquete más ligero.
DEMO: Startup
Peticiones Http
Peticiones Http
Detalles:
• La reutilización de HttpClient nos ayuda
a reducir drásticamente los tiempos.
Esto se debe a que segregará las cosas
de las que cada servidor puede
depender, como las cookies o
DefaultRequestHeaders.
• Un error común al trabajar con
HttpClient es descargar el contenido del
Json en una cadena. El problema es que
esto crea una cadena de todo su
documento JSON innecesariamente.
Impacta en el tiempo y la memoria a
utilizar. Usar Streams directamente.
• Usar GZIP siempre que sea posible.
• Usar Xamarin's Native
HttpMessageHandlers.
Otros
IoC
Detalles:
• Valor tomado de la media de 5
medidas.
• Aunque con limitaciones,
DependencyService de
Xamarin.Forms tiene un
rendimiento muy bueno.
• Entre las librerías más
utilizadas, TinyIoC o DryIoC
entre otras destaca como una
de las más rápidas.
Custom Renderers
protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e)
{
base.OnElementChanged (e);
if (Control == null) {
// Instantiate the native control
}
if (e.OldElement != null) {
// Unsubscribe from event handlers and cleanup any resources
}
if (e.NewElement != null) {
// Configure the control and subscribe to event handlers
}
}
Compresión de Layout
• Layout Compression permite indicar elementos con anidamiento
innecesario y optar a no crear layout. Con esta opción habilitada los layouts
se optimizarán en tiempo de compilación permitiendo obtener un mejor
rendimiento en tiempo de ejecución.
• Layout Compression elimina layouts encargados de gestionar aspectos
como gestos, etc. Si tu Layout utiliza las propiedades Rotation, Scale,
TranslationX o TranslationY (entre otras), no es un buen candidato.
<Grid
CompressedLayout.IsHeadless="true">
</Grid>
Compresión de Layout
<ContentView ...>
<StackLayout>
<StackLayout ...>
<AbsoluteLayout ...>
<Button ... />
<Image ... />
<Image ... />
<BoxView ... />
<Label ... />
<Button ... />
</AbsoluteLayout>
</StackLayout>
<Label ... />
</StackLayout>
</ContentView>
17 views 14 views (8 utilizando
Fast Renderers)
Recuerda!
• 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.
Código
https://github.com/jsuarezruiz/xamarin-forms-perf-playground
• Detalles:
• Más de una docena
de ejemplos.
• Varios Profilers para
medir tiempo de
arranque, memoria
consumida, jerarquía
de elementos, etc.
• Xamarin.Forms
incluye Profiler en
v4.2
https://github.com/x
amarin/Xamarin.For
ms/pull/6087/files
Preguntas &
Respuestas
One more thing
Concurso.
Al final del evento habrá un concurso. ¡No te lo
pierdas!.
Entre todos los tweets del evento relacionados
con la charla, sortearemos una licencia de:
• LiveXAML www.livexaml.com
• Aurora Controls www.auroracontrols.app
• MFractor www.mfractor.com
Thanks and …
See you soon!
Thanks also to the sponsors.
Without whom this would not have been posible.

Weitere ähnliche Inhalte

Was ist angesagt?

Windows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAMLWindows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAMLJavier Suárez Ruiz
 
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.FormsMonkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.FormsJavier Suárez Ruiz
 
OpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinOpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinJavier Suárez Ruiz
 
WinObjC: Windows Bridge para iOS
WinObjC: Windows Bridge para iOSWinObjC: Windows Bridge para iOS
WinObjC: Windows Bridge para iOSJavier Suárez Ruiz
 
Reconnect(); Sevilla - Universal Windows Platform
Reconnect(); Sevilla - Universal Windows PlatformReconnect(); Sevilla - Universal Windows Platform
Reconnect(); Sevilla - Universal Windows PlatformJavier Suárez Ruiz
 
10 razones para elegir WPF
10 razones para elegir WPF10 razones para elegir WPF
10 razones para elegir WPFbialguos
 
Integración Continua con Apps Xamarin
Integración Continua con Apps XamarinIntegración Continua con Apps Xamarin
Integración Continua con Apps XamarinJavier Suárez Ruiz
 
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el diaFrancisco Aranda
 
Xamarin Dev Days Málaga 2017 - Apps conectadas con Azure
Xamarin Dev Days Málaga 2017 - Apps conectadas con AzureXamarin Dev Days Málaga 2017 - Apps conectadas con Azure
Xamarin Dev Days Málaga 2017 - Apps conectadas con AzureJavier Suárez Ruiz
 
Interfaces Adaptativas en Windows 10
Interfaces Adaptativas en Windows 10Interfaces Adaptativas en Windows 10
Interfaces Adaptativas en Windows 10Javier Suárez Ruiz
 

Was ist angesagt? (20)

Taller Xamarin Monkey Conf 2018
Taller Xamarin Monkey Conf 2018Taller Xamarin Monkey Conf 2018
Taller Xamarin Monkey Conf 2018
 
Windows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAMLWindows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAML
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
 
Extendiendo Xamarin.Forms
Extendiendo Xamarin.FormsExtendiendo Xamarin.Forms
Extendiendo Xamarin.Forms
 
Introducción a Xamarin.Forms
Introducción a Xamarin.FormsIntroducción a Xamarin.Forms
Introducción a Xamarin.Forms
 
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.FormsMonkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
 
OpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinOpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller Xamarin
 
Novedades en XAML
Novedades en XAMLNovedades en XAML
Novedades en XAML
 
WinObjC: Windows Bridge para iOS
WinObjC: Windows Bridge para iOSWinObjC: Windows Bridge para iOS
WinObjC: Windows Bridge para iOS
 
.Net Conf Sevilla 2018
.Net Conf Sevilla 2018.Net Conf Sevilla 2018
.Net Conf Sevilla 2018
 
Reconnect(); Sevilla - Universal Windows Platform
Reconnect(); Sevilla - Universal Windows PlatformReconnect(); Sevilla - Universal Windows Platform
Reconnect(); Sevilla - Universal Windows Platform
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
10 razones para elegir WPF
10 razones para elegir WPF10 razones para elegir WPF
10 razones para elegir WPF
 
Servicios Xamarin
Servicios XamarinServicios Xamarin
Servicios Xamarin
 
Integración Continua con Apps Xamarin
Integración Continua con Apps XamarinIntegración Continua con Apps Xamarin
Integración Continua con Apps Xamarin
 
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
 
Hola RoR
Hola RoRHola RoR
Hola RoR
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia
 
Xamarin Dev Days Málaga 2017 - Apps conectadas con Azure
Xamarin Dev Days Málaga 2017 - Apps conectadas con AzureXamarin Dev Days Málaga 2017 - Apps conectadas con Azure
Xamarin Dev Days Málaga 2017 - Apps conectadas con Azure
 
Interfaces Adaptativas en Windows 10
Interfaces Adaptativas en Windows 10Interfaces Adaptativas en Windows 10
Interfaces Adaptativas en Windows 10
 

Ähnlich wie Optimizando Apps con Xamarin.Forms

Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Facescok12v
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño Ijjegonzalezf
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETAlberto Diaz Martin
 
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLiteParte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLiteJuan Manuel
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010Omar Rios
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a BackboneOscar Gensollen
 
Aplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipAplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipJose B Flores P
 
Salesforce Lightning Components
Salesforce Lightning ComponentsSalesforce Lightning Components
Salesforce Lightning ComponentsDavid Carnicer
 
Rendimiento Java Script - Programador PHP
Rendimiento  Java Script - Programador PHPRendimiento  Java Script - Programador PHP
Rendimiento Java Script - Programador PHPJuan Belón Pérez
 
Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightParadigma Digital
 
Planificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phonePlanificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phoneSorey García
 
Msdn Webcast InyeccióN De Dependencias Con Spring Framework
Msdn Webcast   InyeccióN De Dependencias Con Spring FrameworkMsdn Webcast   InyeccióN De Dependencias Con Spring Framework
Msdn Webcast InyeccióN De Dependencias Con Spring FrameworkGabriel Oliva
 

Ähnlich wie Optimizando Apps con Xamarin.Forms (20)

Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Android Superstar - Buenas Prácticas
Android Superstar - Buenas PrácticasAndroid Superstar - Buenas Prácticas
Android Superstar - Buenas Prácticas
 
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLiteParte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a Backbone
 
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
 
Aplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipAplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membership
 
Salesforce Lightning Components
Salesforce Lightning ComponentsSalesforce Lightning Components
Salesforce Lightning Components
 
Arquitectura java web
Arquitectura java webArquitectura java web
Arquitectura java web
 
Rendimiento Java Script - Programador PHP
Rendimiento  Java Script - Programador PHPRendimiento  Java Script - Programador PHP
Rendimiento Java Script - Programador PHP
 
Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring Insight
 
Taller de zan php
Taller de zan phpTaller de zan php
Taller de zan php
 
Planificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phonePlanificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phone
 
Tutorial java fx_8_espanol
Tutorial java fx_8_espanolTutorial java fx_8_espanol
Tutorial java fx_8_espanol
 
Video
VideoVideo
Video
 
Msdn Webcast InyeccióN De Dependencias Con Spring Framework
Msdn Webcast   InyeccióN De Dependencias Con Spring FrameworkMsdn Webcast   InyeccióN De Dependencias Con Spring Framework
Msdn Webcast InyeccióN De Dependencias Con Spring Framework
 

Mehr von Javier Suárez Ruiz

Cape Town MS Developer User Group: Xamarin Community Toolkit
Cape Town MS Developer User Group: Xamarin Community ToolkitCape Town MS Developer User Group: Xamarin Community Toolkit
Cape Town MS Developer User Group: Xamarin Community ToolkitJavier Suárez Ruiz
 
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.Forms
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.FormsTech Club Asturias: Un vistazo al presente y futuro de Xamarin.Forms
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.FormsJavier Suárez Ruiz
 
Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....
Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....
Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....Javier Suárez Ruiz
 
Crear interfaces de usuario atractivas con Xamarin.Forms
Crear interfaces de usuario atractivas con Xamarin.FormsCrear interfaces de usuario atractivas con Xamarin.Forms
Crear interfaces de usuario atractivas con Xamarin.FormsJavier Suárez Ruiz
 
Desarrollo Xamarin, más allá del desarrollo
Desarrollo Xamarin, más allá del desarrolloDesarrollo Xamarin, más allá del desarrollo
Desarrollo Xamarin, más allá del desarrolloJavier Suárez Ruiz
 
Aumento de productividad, herramientas Xamarin
Aumento de productividad, herramientas XamarinAumento de productividad, herramientas Xamarin
Aumento de productividad, herramientas XamarinJavier Suárez Ruiz
 
Plain Concepts Tech Day: Desarrollo de aplicaciones multiplataforma con Xamarin
Plain Concepts Tech Day:  Desarrollo de aplicaciones multiplataforma con XamarinPlain Concepts Tech Day:  Desarrollo de aplicaciones multiplataforma con Xamarin
Plain Concepts Tech Day: Desarrollo de aplicaciones multiplataforma con XamarinJavier Suárez Ruiz
 
Novedades Xamarin Connect(); 2017
Novedades Xamarin Connect(); 2017Novedades Xamarin Connect(); 2017
Novedades Xamarin Connect(); 2017Javier Suárez Ruiz
 
Codemotion 2017 - Taller Xamarin
Codemotion 2017 - Taller XamarinCodemotion 2017 - Taller Xamarin
Codemotion 2017 - Taller XamarinJavier Suárez Ruiz
 
dotNetMálaga 2017 - Taller Hololens con Wave Engine
dotNetMálaga 2017 - Taller Hololens con Wave EnginedotNetMálaga 2017 - Taller Hololens con Wave Engine
dotNetMálaga 2017 - Taller Hololens con Wave EngineJavier Suárez Ruiz
 
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...Javier Suárez Ruiz
 
Xamarin Dev Days Madrid 2017 - Xamarin.Forms
Xamarin Dev Days Madrid 2017 -  Xamarin.FormsXamarin Dev Days Madrid 2017 -  Xamarin.Forms
Xamarin Dev Days Madrid 2017 - Xamarin.FormsJavier Suárez Ruiz
 

Mehr von Javier Suárez Ruiz (16)

Cape Town MS Developer User Group: Xamarin Community Toolkit
Cape Town MS Developer User Group: Xamarin Community ToolkitCape Town MS Developer User Group: Xamarin Community Toolkit
Cape Town MS Developer User Group: Xamarin Community Toolkit
 
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.Forms
Tech Club Asturias: Un vistazo al presente y futuro de Xamarin.FormsTech Club Asturias: Un vistazo al presente y futuro de Xamarin.Forms
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: Xamarin Community Toolkit: More possibilities with Xamarin....Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....
Monkey Conf 2020: Xamarin Community Toolkit: More possibilities with Xamarin....
 
Crear interfaces de usuario atractivas con Xamarin.Forms
Crear interfaces de usuario atractivas con Xamarin.FormsCrear interfaces de usuario atractivas con Xamarin.Forms
Crear interfaces de usuario atractivas con Xamarin.Forms
 
#XamarinUIJuly Summary
#XamarinUIJuly Summary#XamarinUIJuly Summary
#XamarinUIJuly Summary
 
Novedades Xamarin 3.0 Preview
Novedades Xamarin 3.0 PreviewNovedades Xamarin 3.0 Preview
Novedades Xamarin 3.0 Preview
 
Desarrollo Xamarin, más allá del desarrollo
Desarrollo Xamarin, más allá del desarrolloDesarrollo Xamarin, más allá del desarrollo
Desarrollo Xamarin, más allá del desarrollo
 
Introducción a Xamarin
Introducción a XamarinIntroducción a Xamarin
Introducción a Xamarin
 
Aumento de productividad, herramientas Xamarin
Aumento de productividad, herramientas XamarinAumento de productividad, herramientas Xamarin
Aumento de productividad, herramientas Xamarin
 
Plain Concepts Tech Day: Desarrollo de aplicaciones multiplataforma con Xamarin
Plain Concepts Tech Day:  Desarrollo de aplicaciones multiplataforma con XamarinPlain Concepts Tech Day:  Desarrollo de aplicaciones multiplataforma con Xamarin
Plain Concepts Tech Day: Desarrollo de aplicaciones multiplataforma con Xamarin
 
Novedades Xamarin Connect(); 2017
Novedades Xamarin Connect(); 2017Novedades Xamarin Connect(); 2017
Novedades Xamarin Connect(); 2017
 
Codemotion 2017 - Taller Xamarin
Codemotion 2017 - Taller XamarinCodemotion 2017 - Taller Xamarin
Codemotion 2017 - Taller Xamarin
 
dotNetMálaga 2017 - Taller Hololens con Wave Engine
dotNetMálaga 2017 - Taller Hololens con Wave EnginedotNetMálaga 2017 - Taller Hololens con Wave Engine
dotNetMálaga 2017 - Taller Hololens con Wave Engine
 
Embeddinator-4000
Embeddinator-4000Embeddinator-4000
Embeddinator-4000
 
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
Xamarin Hol - Módulo V: Mobile DevOps con Visual Studio Team Services y Hocke...
 
Xamarin Dev Days Madrid 2017 - Xamarin.Forms
Xamarin Dev Days Madrid 2017 -  Xamarin.FormsXamarin Dev Days Madrid 2017 -  Xamarin.Forms
Xamarin Dev Days Madrid 2017 - Xamarin.Forms
 

Kürzlich hochgeladen

Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024anasofiarodriguezcru
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaElizabethLpezSoto
 
TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888ElianaValencia28
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskbydaniela5
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdflauralizcano0319
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
Trabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalTrabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalEmanuelCastro64
 
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxBLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxhellendiaz12
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaYeimys Ch
 
tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6SaraMineiropalacio
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfJoseAlejandroPerezBa
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 

Kürzlich hochgeladen (18)

Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestría
 
TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
Trabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalTrabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamental
 
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docxBLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
BLOG, EXCEL AVANZADO, MÉTODOS ESTADÍSTICOS..docx
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
 
tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6tecno 2024.pdf sara mineiro palacio 10-6
tecno 2024.pdf sara mineiro palacio 10-6
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 

Optimizando Apps con Xamarin.Forms

  • 3. @jsuarezruiz javiersuarezruiz@hotmail.com Trabajo en Microsoft en Visual Studio para macOS. Coordinador de CartujaDotNet, comunidad .NET de Sevilla y de SVQXDG, comunidad Xamarin de Sevilla. Javier Suárez Senior Software Engineer at Microsoft
  • 4. Oops!. Problema con el rendimiento •Normalmente, el rendimiento es un punto que se suele tener en cuenta “al final” y “si es necesario”. •El objetivo de esta sesión sera que te quedes con consejos, ideas y factores a tener en cuenta para que la preocupación por el rendimiento se traslade durante todo el desarrollo.
  • 5. ¿Qué vamos a ver? 1.XAMLC 2.Bindings 3.Fast Renderers 4.Images 5.Layouts 6.CollectionView (y ListView) 7.Visual 8.Shell 9.Startup 10.Peticiones Http 11.Otros (IoC, Custom Renderers, etc)
  • 6. Suma y sigue. No hay “magia”. • Vamos a ver una sucesión de ideas y consejos relacionadas con Xamarin.Forms. 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.
  • 7. Xamarin Classic 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
  • 8. Xamarin.Forms 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
  • 9. A tener en cuenta... •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 Custom Renderers o Effects. Las claves.
  • 10. Step VS 2017 15.8 VS 2019 16.0 Diferencia Primera Build 01:04.20 00:50.13 -21.95% Incremental Build (Cambios en XAML) 00:10.62 00:07.47 -29.66% Despliegue (Cambios en XAML) 00:09.03 00:04.44 -50.83% SmartHotel Reference App
  • 11. XAMLC
  • 12. Compilación de XAML 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. XAMLC
  • 13. Compilación de XAML [assembly: XamlCompilation(XamlCompilationOptions.Compile)] Detalles: • TipCalc en Android. • JIT. • Tiempo calculado con InitializeComponent() . • Tiempo medio de 5 medidas. • Oneplus 6.
  • 15. Bindings y MVVM • Binding es una características incluida en Xamarin.Forms. • Permite crear asociaciones entre una Fuente y un destino. • Permite aplicar MVVM desacoplando Modelo y Vista interponiendo una capa intermedia, la ViewModel. Propiedad pública BindableProperty Source TargetBinding OneWay TwoWay OneWayToSource
  • 16. Bindings, el funcionamiento 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. Bindings Detalles: • El sistema de Bindings es rápido, pero tiene un costo en el rendimiento. • Los errores de enlace a datos tienen impacto en el rendimiento. • En ocasiones, evitar el enlace a datos ayuda a mejorar el rendimiento (Ejemplo: listado con celda personalizada).
  • 19. Fast Renderers Hablamos de cambios realizados en Xamarin.Forms con el objetivo de reducir a mínimos el número de operaciones y cálculos a realizar para renderizar el control y gestionar su tamaño y posición. ¿Qué aporta?
  • 20. Pre Fast Renderers (Label) OnLayout(); OnLayout(); ViewRenderer MeasureAndLayout(); ViewRenderer OnLayout(); ViewElementRenderer UpdateLayout(); LabelRenderer
  • 21. Post Fast Renderers (Label) OnLayout(); OnLayout(); ViewRenderer
  • 22. Fast Renderers Detalles: • Tiempo de incialización y creación de la vista. • Android. • JIT. • Tiempo tomado de 5 medidas. • One Plus 6. • Se usan por defecto en Xamarin.Forms 4.0!
  • 24. Images Detalles: • La opción más sencilla y directa de mejorar la gestión de imágenes es usando FFImageLoading. • GlideX tiene mejor rendimiento que FFImageLoading en Android. • Gracias a IImageSourceHandler se puede personalizar que usar para la gestión de ImageSource en cada plataforma. Por ejemplo, usar FFImageLoading en iOS y GlideX en Android. • Se esta trabajando activamente en mejorar la gestión de imágenes en Xamarin.Forms. Reducción en un 15% de media en el uso de memoria en la v4.0 en comparación a v3.6.
  • 25. IImageSourceHandler Desde Xamarin.Forms 2.3.5, tenemos la interfaz IImageSourceHandler. Permite implementar ImageSource en la plataforma. Las claves. public class ImageSourceHandler : IImageSourceHandler { public Task<UIImage> LoadImageAsync( ImageSource imageSource, CancellationToken cancellationToken = new CancellationToken(), float scale = 1) { return LoadUsingFFImageLoading( imageSource, cancellationToken); } ... } ExportImageSourceHandler
  • 28. 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.
  • 29. El ciclo de vida de un Layout 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”.
  • 31. Ciclo de Layout NoSi Por cada hijo Layout.Children
  • 32. Grid 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.
  • 33. Consejos Grid 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>
  • 34. Consejos 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>
  • 35. Consejos 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>
  • 36. StackLayout 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.
  • 37. Consejos StackLayout 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>
  • 38. RelativeLayout 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.
  • 39. Layouts Detalles: • 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. • RelativeLayout tiene el peor rendimiento. Alto consumo de CPU. • FlexLayout, no es el vencedor en cuanto a rendimiento aunque dada su flexibilidad y rendimiento es una opción altamente recomendada. • En caso de posicionar pudiendo usar posiciones absolutas, AbsoluteLayout no tiene rival.
  • 41. 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"/>
  • 42. Consejos ListView • 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!
  • 43. Consejos ListView <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>
  • 44. Consejos 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.
  • 45. • Soporta layouts Horizontal/Vertical • Soporte a multiples columnas/filas de elementos • Es como una versión moderna de ListView • No es necesario usar Cells • Se usan Views y DataTemplates • Mejora considerable en el rendimiento. https://github.com/xamarin/Xamarin.Forms/issues/3172
  • 46. CollectionView Detalles: • Media de 5 medidas. • La gestión de celdas es mucho más eficiente en CollectionView, es la clave. • El consumo de memoria es inferior al usar CollectionView con respecto a ListView. • Los tiempos necesarios para renderizado de celdas, es más óptimo en CollectionView. • Tras medir también el tiempo de arranque de la App, es también ligeramente mejor en CollectionView.
  • 48. Actualmente, muchas aplicaciones se ven a nivel estético exactamente igual en todas las plataformas. En Xamarin.Forms, para conseguir este resultado, en ocasiones hacen falta Custom Renders o efectos (código específico de plataforma) para conseguirlo. Por ese motivo, llega una nueva opción para conseguir la misma interfaz de usuario en diferentes plataformas sin necesidad de requerir tanto a Custom Renders o efectos.
  • 50. ¿Cómo usar Visual? FormsMaterial.Init(); <ContentPage Visual=“Material”> … </ContentPage> Los valores posibles de la propiedad Visual: • Default : indica que la vista debe presentarse mediante el representador predeterminado. • MatchParent : indica que la vista debe utilizar el representador mismo como su elemento primario directo. • Material : indica que la vista debe representar con un procesador de material.
  • 51. Visual Detalles: • Media de 5 medidas. • Todos los renderers de Visual son Fast Renderers. • Los renderers de Visual tienen un rendimiento general mejor que los de por defecto (salvo el Entry). • La gestión de recursos (eventos, dependencias, etc.) es mejor en los renderers en Visual, impacta en el consumo de memoria. Mejor con Visual.
  • 52.
  • 54. Shell
  • 55. Facilita la creación de la estructura de la aplicación • Un lugar común donde describir la estructura de la aplicación. • Servicio de navegación con deep linking. • Gestión de búsquedas integradas.
  • 56. • Mejor rendimiento • Facilitar crear Layouts complejos • Navegación con Flyout y pestañas • URL routed navigation, deep linking • Mejoras en la navegación, gestion de navegar atrás • Search handler • Snackbar • Bottom Sheet • Floating Action Button • Left Bar Button • Screen segues • Transiciones de páginas • Nueva API de gestos • Además de todo lo que ya era posible con Xamarin.Forms antes
  • 57. Shell Detalles: • Datos tomados de 5 medidas en Android. • Rendimiento mejor en iOS que en Android. • Shell tiene un consumo de memoria medio más bajo. • El tiempo de arranque es ligeramente mejor en iOS y a su ves ligeramente peor en Android que sin usar Shell.
  • 59. Startup • La opción compilación AOT habilita la compilación Ahead Of Time de los ensamblados. Cuando esta opción está habilitada, la sobrecarga de inicio Just-In-Time (JIT) se minimiza al precompilar ensamblados antes del tiempo de ejecución. El código nativo resultante se incluye en el paquete (APK) junto con los ensamblados sin compilar. Esto da como resultado un tiempo de inicio de la aplicación más reducido, pero a costa de tamaños APK más grandes. • A costa de tiempos de compilación más lentos, el compilador de optimización de LLVM debe crear un código compilado más pequeño y rápido.
  • 60. Startup (tiempo de arranque) Detalles: • AOT reduce casi a la mitad el tiempo de arranque!. • AOT incrementa el tamaño del paquete!. • La optimización LLVM tiene un ligero impacto en el tiempo de arranque, aunque nos ayuda a tener un paquete más ligero.
  • 63. Peticiones Http Detalles: • La reutilización de HttpClient nos ayuda a reducir drásticamente los tiempos. Esto se debe a que segregará las cosas de las que cada servidor puede depender, como las cookies o DefaultRequestHeaders. • Un error común al trabajar con HttpClient es descargar el contenido del Json en una cadena. El problema es que esto crea una cadena de todo su documento JSON innecesariamente. Impacta en el tiempo y la memoria a utilizar. Usar Streams directamente. • Usar GZIP siempre que sea posible. • Usar Xamarin's Native HttpMessageHandlers.
  • 64. Otros
  • 65. IoC Detalles: • Valor tomado de la media de 5 medidas. • Aunque con limitaciones, DependencyService de Xamarin.Forms tiene un rendimiento muy bueno. • Entre las librerías más utilizadas, TinyIoC o DryIoC entre otras destaca como una de las más rápidas.
  • 66. Custom Renderers protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e) { base.OnElementChanged (e); if (Control == null) { // Instantiate the native control } if (e.OldElement != null) { // Unsubscribe from event handlers and cleanup any resources } if (e.NewElement != null) { // Configure the control and subscribe to event handlers } }
  • 67. Compresión de Layout • Layout Compression permite indicar elementos con anidamiento innecesario y optar a no crear layout. Con esta opción habilitada los layouts se optimizarán en tiempo de compilación permitiendo obtener un mejor rendimiento en tiempo de ejecución. • Layout Compression elimina layouts encargados de gestionar aspectos como gestos, etc. Si tu Layout utiliza las propiedades Rotation, Scale, TranslationX o TranslationY (entre otras), no es un buen candidato. <Grid CompressedLayout.IsHeadless="true"> </Grid>
  • 68. Compresión de Layout <ContentView ...> <StackLayout> <StackLayout ...> <AbsoluteLayout ...> <Button ... /> <Image ... /> <Image ... /> <BoxView ... /> <Label ... /> <Button ... /> </AbsoluteLayout> </StackLayout> <Label ... /> </StackLayout> </ContentView> 17 views 14 views (8 utilizando Fast Renderers)
  • 69. Recuerda! • 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.
  • 70. Código https://github.com/jsuarezruiz/xamarin-forms-perf-playground • Detalles: • Más de una docena de ejemplos. • Varios Profilers para medir tiempo de arranque, memoria consumida, jerarquía de elementos, etc. • Xamarin.Forms incluye Profiler en v4.2 https://github.com/x amarin/Xamarin.For ms/pull/6087/files
  • 72. One more thing Concurso. Al final del evento habrá un concurso. ¡No te lo pierdas!. Entre todos los tweets del evento relacionados con la charla, sortearemos una licencia de: • LiveXAML www.livexaml.com • Aurora Controls www.auroracontrols.app • MFractor www.mfractor.com
  • 73. Thanks and … See you soon! Thanks also to the sponsors. Without whom this would not have been posible.

Hinweis der Redaktion

  1. Both
  2. https://www.youtube.com/watch?v=RZvdql3Ev0E
  3. Miguel
  4. https://www.youtube.com/watch?v=RZvdql3Ev0E
  5. Miguel
  6. Miguel ->James