SlideShare una empresa de Scribd logo
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.

Más contenido relacionado

La actualidad más candente

Taller Xamarin Monkey Conf 2018
Taller Xamarin Monkey Conf 2018Taller Xamarin Monkey Conf 2018
Taller Xamarin Monkey Conf 2018
Javier Suárez Ruiz
 
Windows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAMLWindows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAML
Javier Suárez Ruiz
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
Javier Suárez Ruiz
 
Extendiendo Xamarin.Forms
Extendiendo Xamarin.FormsExtendiendo Xamarin.Forms
Extendiendo Xamarin.Forms
Javier Suárez Ruiz
 
Introducción a Xamarin.Forms
Introducción a Xamarin.FormsIntroducción a Xamarin.Forms
Introducción a Xamarin.Forms
Javier 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.Forms
Javier Suárez Ruiz
 
OpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinOpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller Xamarin
Javier Suárez Ruiz
 
Novedades en XAML
Novedades en XAMLNovedades en XAML
Novedades en XAML
Javier Suárez Ruiz
 
WinObjC: Windows Bridge para iOS
WinObjC: Windows Bridge para iOSWinObjC: Windows Bridge para iOS
WinObjC: Windows Bridge para iOS
Javier Suárez Ruiz
 
.Net Conf Sevilla 2018
.Net Conf Sevilla 2018.Net Conf Sevilla 2018
.Net Conf Sevilla 2018
Javier Suárez Ruiz
 
Reconnect(); Sevilla - Universal Windows Platform
Reconnect(); Sevilla - Universal Windows PlatformReconnect(); Sevilla - Universal Windows Platform
Reconnect(); Sevilla - Universal Windows Platform
Javier Suárez Ruiz
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
Mario Alberto Chavez
 
10 razones para elegir WPF
10 razones para elegir WPF10 razones para elegir WPF
10 razones para elegir WPF
bialguos
 
Servicios Xamarin
Servicios XamarinServicios Xamarin
Servicios Xamarin
Javier Suárez Ruiz
 
Integración Continua con Apps Xamarin
Integración Continua con Apps XamarinIntegración Continua con Apps Xamarin
Integración Continua con Apps Xamarin
Javier 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 RoR
Jose Rojas
 
Hola RoR
Hola RoRHola 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
Francisco 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 Azure
Javier Suárez Ruiz
 
Interfaces Adaptativas en Windows 10
Interfaces Adaptativas en Windows 10Interfaces Adaptativas en Windows 10
Interfaces Adaptativas en Windows 10
Javier Suárez Ruiz
 

La actualidad más candente (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
 

Similar a DotNet 2019: Optimizando Apps con Xamarin.Forms

Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2
Josué Yeray Julián Ferreiro
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
cok12v
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
jjegonzalezf
 
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
Alberto Diaz Martin
 
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
Alberto Diaz Martin
 
Android Superstar - Buenas Prácticas
Android Superstar - Buenas PrácticasAndroid Superstar - Buenas Prácticas
Android Superstar - Buenas Prácticas
Ignacio Muñoz Vicente
 
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
Juan Manuel
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010
Omar Rios
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a Backbone
Oscar Gensollen
 
(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
Microsoft Argentina y Uruguay [Official Space]
 
Aplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipAplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membership
Jose B Flores P
 
Salesforce Lightning Components
Salesforce Lightning ComponentsSalesforce Lightning Components
Salesforce Lightning Components
David Carnicer
 
Arquitectura java web
Arquitectura java webArquitectura java web
Arquitectura java web
Jose Luis Bugarin Peche
 
Rendimiento Java Script - Programador PHP
Rendimiento  Java Script - Programador PHPRendimiento  Java Script - Programador PHP
Rendimiento Java Script - Programador PHP
Juan 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 Insight
Paradigma Digital
 
Taller de zan php
Taller de zan phpTaller de zan php
Taller de zan php
programadoresmx
 
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
Sorey García
 
Tutorial java fx_8_espanol
Tutorial java fx_8_espanolTutorial java fx_8_espanol
Tutorial java fx_8_espanol
Eder Miguel Zamora Sanchez
 
Video
VideoVideo
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
Gabriel Oliva
 

Similar a DotNet 2019: 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
 
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
 
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
 
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
 

Más de 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 Toolkit
Javier 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.Forms
Javier 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.Forms
Javier Suárez Ruiz
 
#XamarinUIJuly Summary
#XamarinUIJuly Summary#XamarinUIJuly Summary
#XamarinUIJuly Summary
Javier Suárez Ruiz
 
Novedades Xamarin 3.0 Preview
Novedades Xamarin 3.0 PreviewNovedades Xamarin 3.0 Preview
Novedades Xamarin 3.0 Preview
Javier 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 desarrollo
Javier Suárez Ruiz
 
Introducción a Xamarin
Introducción a XamarinIntroducción a Xamarin
Introducción a Xamarin
Javier Suárez Ruiz
 
Aumento de productividad, herramientas Xamarin
Aumento de productividad, herramientas XamarinAumento de productividad, herramientas Xamarin
Aumento de productividad, herramientas Xamarin
Javier 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 Xamarin
Javier Suárez Ruiz
 
Novedades Xamarin Connect(); 2017
Novedades Xamarin Connect(); 2017Novedades Xamarin Connect(); 2017
Novedades Xamarin Connect(); 2017
Javier Suárez Ruiz
 
Codemotion 2017 - Taller Xamarin
Codemotion 2017 - Taller XamarinCodemotion 2017 - Taller Xamarin
Codemotion 2017 - Taller Xamarin
Javier 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 Engine
Javier Suárez Ruiz
 
Embeddinator-4000
Embeddinator-4000Embeddinator-4000
Embeddinator-4000
Javier 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.Forms
Javier Suárez Ruiz
 

Más de 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
 

Último

La Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docxLa Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docx
luiscohailatenazoa0
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
yuberpalma
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
AbrahamCastillo42
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
codesiret
 
Uso de las Tics en la vida cotidiana.pptx
Uso de las Tics en la vida cotidiana.pptxUso de las Tics en la vida cotidiana.pptx
Uso de las Tics en la vida cotidiana.pptx
231485414
 
CURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdf
CURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdfCURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdf
CURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdf
LagsSolucSoporteTecn
 
Presentación Seguridad Digital Profesional Azul Oscuro (1).pdf
Presentación Seguridad Digital Profesional Azul Oscuro (1).pdfPresentación Seguridad Digital Profesional Azul Oscuro (1).pdf
Presentación Seguridad Digital Profesional Azul Oscuro (1).pdf
giampierdiaz5
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
larapalaciosmonzon28
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
YashiraPaye
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
Flows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos FeaturesFlows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos Features
Paola De la Torre
 
El uso de las TIC's en la vida cotidiana
El uso de las TIC's en la vida cotidianaEl uso de las TIC's en la vida cotidiana
El uso de las TIC's en la vida cotidiana
231458066
 
Manual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputosManual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputos
cbtechchihuahua
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
larapalaciosmonzon28
 
UML_clase_02_UML_casos_de_uso_05 EN DIAGRAMA
UML_clase_02_UML_casos_de_uso_05 EN DIAGRAMAUML_clase_02_UML_casos_de_uso_05 EN DIAGRAMA
UML_clase_02_UML_casos_de_uso_05 EN DIAGRAMA
martinezluis17
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
leia ereni
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
AMADO SALVADOR
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
larapalaciosmonzon28
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
cecypozos703
 
trabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdk
trabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdktrabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdk
trabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdk
KukiiSanchez
 

Último (20)

La Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docxLa Inteligencia Artificial en la actualidad.docx
La Inteligencia Artificial en la actualidad.docx
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
 
Uso de las Tics en la vida cotidiana.pptx
Uso de las Tics en la vida cotidiana.pptxUso de las Tics en la vida cotidiana.pptx
Uso de las Tics en la vida cotidiana.pptx
 
CURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdf
CURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdfCURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdf
CURSO CAMARAS DE SEGURIDAD 2023 FINAL .pdf
 
Presentación Seguridad Digital Profesional Azul Oscuro (1).pdf
Presentación Seguridad Digital Profesional Azul Oscuro (1).pdfPresentación Seguridad Digital Profesional Azul Oscuro (1).pdf
Presentación Seguridad Digital Profesional Azul Oscuro (1).pdf
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
Flows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos FeaturesFlows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos Features
 
El uso de las TIC's en la vida cotidiana
El uso de las TIC's en la vida cotidianaEl uso de las TIC's en la vida cotidiana
El uso de las TIC's en la vida cotidiana
 
Manual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputosManual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputos
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
 
UML_clase_02_UML_casos_de_uso_05 EN DIAGRAMA
UML_clase_02_UML_casos_de_uso_05 EN DIAGRAMAUML_clase_02_UML_casos_de_uso_05 EN DIAGRAMA
UML_clase_02_UML_casos_de_uso_05 EN DIAGRAMA
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
 
trabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdk
trabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdktrabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdk
trabajo práctico kuikikiikkidfsmdklfskdnfklsdnfknsdk
 

DotNet 2019: 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.

Notas del editor

  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