SlideShare una empresa de Scribd logo
1 de 78
Visual Studio Technologies & Windows
Platform Development MVP
Xamarin MVP
Software Developer at Plain Concepts
• Blog: http://geeks.ms/blogs/jsuarez
• Email: javiersuarezruiz@hotmail.com
• Twitter: @jsuarezruiz
Classic VS Forms
Base de código C# compartido
100% de acceso a APIs nativas
Alto rendimiento
iOS C# UI Windows C# UIAndroid C# UI
Código compartido C#
Interfaces dependientes de código
nativo
Más código compartido. UI XAML o C#
Data Binding & MVVM
Abstracciones (Navegación, etc.)
iOS C# UI Windows C# UIAndroid C# UI
Código compartido C#
Rendimiento < Xamarin.Classic
UI Compartida
• Xamarin.Forms NO es apto para todo tipo de
aplicaciones.
• Es perfecto para aplicaciones de entrada de datos.
• No es lo ideal para aplicaciones visualmente
complejas.
• Utilizado en fases iniciales de prototipado.
• El XAML es diferente al XAML de UWP.
• Es un framework aún joven.
Xamarin.Forms permite crear aplicaciones complejas con interfaces atractivas.
github.com/Microsoft/BikeSharing360_MobileApps
93.7% code share
Xamarin.Forms permite crear aplicaciones complejas con interfaces atractivas.
github.com/jsuarezruiz/xamarin-forms-goodlooking-UI
• Hay que tener en cuenta la capa de abstracción.
• No se puede desarrollar absolutamente todo sin
pensar en que hay “debajo”.
• Hay que utilizar los controles adecuados en cada caso.
• El árbol visual debe ser parte de nuestra
responsabilidad.
• A veces es necesario código nativo en forma de
Cunstom Renderers o Effects.
XamlC
Si defines la interfaz de usuario de la aplicación Xamarin.Forms con XAML tienes la
opción de utilizar XamlCompilationOptions.
Cuenta con dos valores:
• Compile.
• Acelera la carga de elementos visuales.
• Reduce el tamaño del paquete.
• La compilación (AOT) es más larga.
• Skip.
• Valor por defecto para mantener retocompatibilidad.
• No hay validación en tiempo de ejecución de XAML.
• Xamarin.Forms
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
• Xamarin.Forms
0
20
40
60
80
100
120
140
160
Android
Tiempo de
inicialización
Skip Compile
 Tiempo calculado
con
InitializeCompone
nt().
 Tiempo medio de 5
medidas.
 Oneplus 3 con
Android 7.1 Nougat.
DEMODEMODEMO
XamlC, pruebas de rendimiento
Bindings
View
ViewModel
Model
get/set
Propiedades
Comandos
Notifica
cambios
C#
Models
View
View
ViewModel
ViewModel
Model
Model
Cross Platform
• Binding es una características incluida en Xamarin.Forms.
• Permite crear asociaciones entre una Fuente y un destino.
• Permite aplicar MVVM descoplando Modelo y Vista
interponiendo una capa intermedia, la ViewModel.
Propiedad pública BindableProperty
Source TargetBinding
OneWay
TwoWay
OneWayToSource
public abstract class BindableObject : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
//...
}
“No enlaces cosas que se pueden establecer de forma estática”
Jason Smith - Evolve 2016
DEMODEMODEMO
“Midiendo” Bindinds
View
• Xamarin.Forms
• Una View es un elemento de bajo nivel
que representa un nodo en el árbol
visual.
• Toda View cuenta con una serie de
propiedades y eventos.
• Ejemplos: Label, Button, etc.
La creación de una View en Xamarin.Forms se
divide en dos fases:
• Inflating: Instanciar la vista.
• Rendering: Añadir al árbol visual.
public MainView()
{
var stackLayout = new StackLayout();
stackLayout.Children.Add(new Button()
{
Text = «Click me!"
});
//...
}
public MainView()
{
//...
Content = stackLayout;
}
• No especificar las propiedades HorizontalOptions y
VerticalOptions con sus valores por defecto. Se
desencadenan diferentes ciclos con cálculos
innecesarios.
• Rendimiento muy superior utilizando TranslationX y
TranslationY en lugar de Margin para posicionar.
• Evitar modificar la Opacity salvo en casos necesarios.
Costoso sobretodo en Android.
Views, entrando en detalle
• Las propiedades bindables VerticalTextAlignment y HorizontalTextAlignment
de tipo TextAlignment están optimizadas para posicionar el contenido del Label.
<Label Text="Testing"
VerticalOptions="Center"
HorizontalOptions="Center"/>
Label Text="Testing"
VerticalTextAlignment="Center"
HorizontalTextAlignment="Center"/>
• A la hora de manejar texto con formato, el control de tipo Label cuenta con la
propiedad bindable FormattedText. Es muchísimo más óptimo que crear un
nuevo Layout con multiples controles de tipo Label.
<StackLayout Orientation="Horizontal">
<Label Text="Hola " TextColor="Red"/>
<Label Text="!" TextColor="Blue"/>
</StackLayout>
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="Hola " ForegroundColor="Red"/>
<Span Text="!" ForegroundColor="Blue" />
</FormattedString>
</Label.FormattedText>
</Label>
• Es más óptimo utilizar un ImageSource de una
imagen desde el sistema de archivos en lugar del
archivo de recursos.
<Image
Source="resource.png"/>
<Image>
<Image.Source>
<FileImageSource File="file.png"/>
</Image.Source>
</Image>
• Desactivar la opacidad.
• Transformaciones y reducción de tamaño preferible
desde el lado del servidor.
• Si no es possible hacer ningún tratamiento desde el
lado del servidor, hacerlo en dispositivo.
FFImageLoafing, cache y reducción de tamaño.
<Image IsOpaque="False"/>
ListView
• Salto cualitativo con Xamarin.Forms 2.0 donde se
añadieron opciones como la reutilización de celdas.
• La reutilización de celdas viene definida por la
propiedad ListViewCachingStrategy que cuenta con
dos posibles valores:
• RecycleElement
• RetainElement
<ListView CachingStrategy="RecycleElement"/>
• El ListView mantiene un grupo de celdas de iguales
dimensiones con el tamaño de la ventana, lo que se
conoce como reutilización de celdas.
• Opción idónea en una enorme variedad de casos pero
no siempre. Por ejemplo, se pueden tener problemas si
se utiliza DataTemplateSelector.
• Es el valor por defecto para garantizar la
compatibilidad con versions anteriores de
Xamarin.Forms.
• El ListView crea una nueva celda por cada element de
la lista.
• En determinadas ocasiones se requiere contenido
adicional al ListView en la parte superior y/o inferior. Es
recomendable utilizar las propiedades
HeaderTemplate y FooterTemplate para ello.
• Envolver al control ListView en un ScrollView rompe
la virtualización!
<ScrollView>
<StackLayout>
<Label Text="Header" />
<ListView />
<Label Text="Footer" />
</StackLayout>
</ScrollView>
<ListView Header="Header" Footer="Footer">
<ListView.HeaderTemplate>
<DataTemplate>
<Label Text="{Binding .}" />
</DataTemplate>
</ListView.HeaderTemplate>
<ListView.FooterTemplate>
<DataTemplate>
<Label Text="{Binding .}" />
</DataTemplate>
</ListView.FooterTemplate>
</ListView>
• Se recomiendo utilizer IList<T> como ItemsSource en
lugar de IEnumerable.
• Si se utiliza RecycleElemement, se aumenta el
rendimiento eliminando el Binding de la celda y
utilizano OnBindingContextChanged.
DEMODEMODEMO
Sacando rendimiento a un
ListView
Layout
• Un Layout representa un nodo en el árbol
visual.
• Un Layout cuenta con propiedades y eventos
que permiten definer su comportamiento.
• Es el responsible de gestionar la ubicación y
el tamaño de nodos secundarios.
• Ejemplos: StackLayout, Grid, etc.
La creación de un Layout en Xamarin.Forms pasa por
dos fases diferentes:
• Ciclo de invalidación: En el árbol visual, el ciclo de
invalidación es el proceso de notificación
recursivamente hacia el nodo padre.
• Ciclo de Layout: Tras invalidar, se procede a la
reorganización de elementos marcados como
“invalidados”.
SiNo
• La invalidación de un Layout puede lanzarse por
diferentes motivos. Cada motive viene indicado en el
enumerado InvalidationTrigger.
public enum InvalidationTrigger {
Undefined = 0,
MeasureChanged = 1 << 0,
HorizontalOptionsChanged = 1 << 1,
VerticalOptionsChanged = 1 << 2,
SizeRequestChanged = 1 << 3,
RendererReady = 1 << 4,
MarginChanged = 1 << 5
}
NoSi
Por cada hijo
Layout.Children
• El ciclo de Layout termina con la llamada a
Layout() del ultimo elemento.
• A diferencia del ciclo de validación, no es
possible controlar el ciclo de Layout.
El Grid organiza los elementos hijos en filas y
columnas.
Permite crear estructuras complejas sin necesidad
de grandes anidaciones.
El tamaño de cada fila y columna es importante, y
afecta al rendimiento. Hay que cuidar la
utilización de celdas y filas.
El Grid organiza los elementos hijos en filas y columnas.
La invalidación de una de las View hijas provoca la
invalidación en cadena del árbol visual de la rejilla.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Label
Grid.Row="1"
Text="Button 2"/>
</Grid>
El Grid puede organizar los elementos con tamaño
proporcional a la View. El Grid ignora cualquier
notificación de invalidación de sus hijos.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Button
Grid.Row="1"
Text="Button 2"/>
</Grid>
El Grid puede organizar los elementos con tamaño fijo. El
Grid ignora cualquier notificación de invalidación de sus
hijos.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Button
Grid.Row="1"
Text="Button 2"/>
</Grid>
El StackLayout organiza los elementos hijos una
sóla fila o columna.
Ideal para la creación sencilla y de forma rápida
de forma secuencial.
CUIDADO!, puede llevar a la anidación excesiva.
El StackLayout organiza los elementos hijos una
sóla fila o columna.
La invalidación de un View hijo provoca la
invalidación en cadena en el árbol visual hasta el
StackLayout.
<StackLayout>
<Button
Text="Button 1"/>
<Button
Text="Button 2"/>
</StackLayout>
” No uses un StackLayout para un único hijo
No uses un Grid cuando el StackLayout hace el trabajo
No uses varios StackLayout cuando un Grid cumple ”
Jason Smith - Evolve 2016
El RelativeLayout organiza los elementos hijos en
base a relaciones entre los diferentes elementos y
el contenedor.
Ideal cuando el tamaño o el posicionamiento dbe
ser dinámico y adaptarse a diferentes
condiciones.
Rendimiento bajo.
DEMODEMODEMO
Pruebas con Layout
Fast Renderers
Hablamos de cambios realizados en Xamarin.Forms con
el objetivo de reducir a mínimos de operaciones y
cálculos a realizar para renderizar el control y gestionar
su tamaño y posición.
OnLayout();
OnLayout();
ViewRenderer
MeasureAndLayout();
ViewRenderer
OnLayout();
ViewElementRenderer
UpdateLayout();
LabelRenderer
OnLayout();
OnLayout();
ViewRenderer
DEMODEMODEMO
Pruebas con Fast Renderers
• Xamarin.Forms
0
100
200
300
400
500
600
700
800
900
1000
Android
Tiempo de
inicialización
Fast No Fast
 Tiempo calculado con
InitializeComponent().
 Tiempo medio de 5 medidas.
 Oneplus 3 con Android 7.1 Nougat.
Custom Renderers
Siempre tendremos DOS PARTES: El Elemento y el Renderer
Element describe la apariencia
del control
Button
Text
TextColor
…
Renderer crea una visualización
específica para cada plataforma
ButtonRenderer
ButtonRenderer
ButtonRenderer
Button
Button
MyButtonRenderer UIImage
Crear la definición en el proyecto Shared/PCL
public class CustomControl : View
{
}
Implementar un renderer por cada plataforma
public class CustomControlRenderer : ViewRenderer<CustomControl,
View>
{
}
• Se suele cometer un fallo típico al realizar la
suscripción de eventos en el renderer y nunca eliminar
la suscripción.
protected override void OnElementChanged(ElementChangedEventArgs<View> e)
{
if (e.NewElement != null)
{
if (Control != null) {
_button = new Button();
_button.Click += OnButtonClick;
}
}
}
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
if (e.OldElement != null)
{
if (Control != null) {
_button.Click -= OnButtonClick;
}
}
}
protected override void OnElementChanged (ElementChangedEventArgs<View> e)
{
base.OnElementChanged (e);
if (Control == null) {
// Se instancia el control nativo y se asignan las propiedades básicas
}
if (e.OldElement != null) {
// Eliminamos la suscrición de eventos y hacemos limpieza de recursos, etc.
}
if (e.NewElement != null) {
// Configura el control y realiza la suscripción de eventos
}
}
¿Impacta?
 Se consume memoria que no se vuelve a recuperar.
 Si el control es muy usado y entran en juego navegación y
otros factores, el impacto puede ser notorio (hablamos de
MBs!).
Behaviors
Un Behavior espera por “algo” para hacer “algo”.
Un Behavior espera por “algo”. Puede ser un evento que
se lanza, el cambio de una propiedad o cualquier otra
acción personalizada que deseamos monitorear. Una
vez que ese “algo” se desencadena, el Behavior puede
hacer acciones muy variadas, desde cambiar el valor de
una propiedad, lanzar un evento, hacer verificaciones o
validaciones, etc.
Veamos un ejemplo.
public class NumericEntryBehavior : Behavior<Entry>
{
private string _lastValidText;
protected override void OnAttachedTo(Entry bindable)
{
bindable.TextChanged += EntryTextChanged;
base.OnAttachedTo(bindable);
}
private void EntryTextChanged(object sender, EventArgs e)
{
var entry = sender as Entry;
if (entry != null)
{
double value;
if (string.IsNullOrEmpty(entry.Text) ||
Double.TryParse(entry.Text, out value))
{
_lastValidText = entry.Text;
return;
}
entry.Text = _lastValidText;
}
}
}
Veamos un ejemplo.
<Entry>
<Entry.Behaviors>
<behaviors:NumericEntryBehavior />
</Entry.Behaviors>
</Entry>
• Se suele cometer un fallo típico al realizar la suscripción de
eventos junto a inicialización de elementos y nunca eliminar
la suscripción o hacer limpieza de recursos.
protected override void OnAttachedTo(Entry bindable)
{
bindable.TextChanged += EntryTextChanged;
base.OnAttachedTo(bindable);
}
protected override void OnAttachedTo(Entry bindable)
{
bindable.TextChanged += EntryTextChanged;
base.OnAttachedTo(bindable);
}
protected override void OnDetachingFrom(Entry bindable)
{
bindable.TextChanged -= EntryTextChanged;
base.OnDetachingFrom(bindable);
}
Otros
• AOT en lugar de JIT reduce los tiempos de arranque (aunque incrementa el
tamaño del paquete).
• Es una buena práctica utilizar App.xaml para gestionar los recursos a nivel de
aplicación. No lo es tanto añadir absolutamente todos los recursos. Son
cargados en el arranque de la App. Analiza si se reutilizan y son necesarios los
recursos, etc.
• Revisa el conjunto de dependencias de la aplicación. En ocasiones hay
dependencias innecesarias, pruebas, etc.
• Las imágenes suelen ser un costo elevado. Reduce lo máximo posible las
imágenes locales de la aplicación Herramientas como TinyPic pueden llegar a
reducir hasta un 80% tamaños.
• Realiza thumbnails de imágenes y utiliza cache. FFImageLoading permite ambas
opciones.
Preguntas y respuestas.
¿Dudas?
&
Xamarin Forms: Optimización de rendimiento

Más contenido relacionado

La actualidad más candente

Creando controles para Xamarin.Forms
Creando controles para Xamarin.FormsCreando controles para Xamarin.Forms
Creando controles para Xamarin.FormsJavier Suárez Ruiz
 
SVQXDG - Introducción a Embeddinator-4000
SVQXDG - Introducción a Embeddinator-4000SVQXDG - Introducción a Embeddinator-4000
SVQXDG - Introducción a Embeddinator-4000Javier Suárez Ruiz
 
Monkey Conf 2020: .NET MAUI Handlers
Monkey Conf 2020: .NET MAUI HandlersMonkey Conf 2020: .NET MAUI Handlers
Monkey Conf 2020: .NET MAUI HandlersJavier Suárez Ruiz
 
OpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinOpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinJavier 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 XamarinJavier 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 XAMLJavier Suárez Ruiz
 
Xamarin Dev Days - Introducción a Xamarin
Xamarin Dev Days - Introducción a XamarinXamarin Dev Days - Introducción a Xamarin
Xamarin Dev Days - Introducción a XamarinJavier Suárez Ruiz
 
Analizando interfaces de usuario avanzadas con Xamarin.Forms
Analizando interfaces de usuario avanzadas con Xamarin.FormsAnalizando interfaces de usuario avanzadas con Xamarin.Forms
Analizando interfaces de usuario avanzadas con Xamarin.FormsJavier Suárez Ruiz
 
Microsoft Tech Summit - Taller Xamarin
Microsoft Tech Summit - Taller XamarinMicrosoft Tech Summit - Taller Xamarin
Microsoft Tech Summit - Taller XamarinJavier Suárez Ruiz
 
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
 
Xamarin Dev Days Madrid - Taller Xamarin
Xamarin Dev Days Madrid - Taller XamarinXamarin Dev Days Madrid - Taller Xamarin
Xamarin Dev Days Madrid - Taller XamarinJavier 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
 
Reconnect(); Sevilla - Introducción a Xamarin 4
Reconnect(); Sevilla - Introducción a Xamarin 4Reconnect(); Sevilla - Introducción a Xamarin 4
Reconnect(); Sevilla - Introducción a Xamarin 4Javier Suárez Ruiz
 
Introducción a Xamarin utilizando MVVMCross
Introducción a Xamarin utilizando MVVMCrossIntroducción a Xamarin utilizando MVVMCross
Introducción a Xamarin utilizando MVVMCrossJavier Suárez Ruiz
 

La actualidad más candente (20)

Creando controles para Xamarin.Forms
Creando controles para Xamarin.FormsCreando controles para Xamarin.Forms
Creando controles para Xamarin.Forms
 
SVQXDG - Introducción a Embeddinator-4000
SVQXDG - Introducción a Embeddinator-4000SVQXDG - Introducción a Embeddinator-4000
SVQXDG - Introducción a Embeddinator-4000
 
Monkey Conf 2020: .NET MAUI Handlers
Monkey Conf 2020: .NET MAUI HandlersMonkey Conf 2020: .NET MAUI Handlers
Monkey Conf 2020: .NET MAUI Handlers
 
OpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller XamarinOpenSouthCode 2018: Taller Xamarin
OpenSouthCode 2018: Taller Xamarin
 
Integración Continua con Apps Xamarin
Integración Continua con Apps XamarinIntegración Continua con Apps Xamarin
Integración Continua con Apps Xamarin
 
Windows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAMLWindows 10: Hel10 World! - Novedades XAML
Windows 10: Hel10 World! - Novedades XAML
 
dotNetMálaga - Taller Xamarin
dotNetMálaga - Taller XamarindotNetMálaga - Taller Xamarin
dotNetMálaga - Taller Xamarin
 
Xamarin Dev Days - Introducción a Xamarin
Xamarin Dev Days - Introducción a XamarinXamarin Dev Days - Introducción a Xamarin
Xamarin Dev Days - Introducción a Xamarin
 
Introducción a Xamarin.Forms
Introducción a Xamarin.FormsIntroducción a Xamarin.Forms
Introducción a Xamarin.Forms
 
Analizando interfaces de usuario avanzadas con Xamarin.Forms
Analizando interfaces de usuario avanzadas con Xamarin.FormsAnalizando interfaces de usuario avanzadas con Xamarin.Forms
Analizando interfaces de usuario avanzadas con Xamarin.Forms
 
Microsoft Tech Summit - Taller Xamarin
Microsoft Tech Summit - Taller XamarinMicrosoft Tech Summit - Taller Xamarin
Microsoft Tech Summit - Taller Xamarin
 
Reconnect(); Sevilla - Keynote
Reconnect(); Sevilla - KeynoteReconnect(); Sevilla - Keynote
Reconnect(); Sevilla - Keynote
 
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
 
Xamarin Dev Days Madrid - Taller Xamarin
Xamarin Dev Days Madrid - Taller XamarinXamarin Dev Days Madrid - Taller Xamarin
Xamarin Dev Days Madrid - Taller Xamarin
 
Desktop App Converter
Desktop App ConverterDesktop App Converter
Desktop App Converter
 
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
 
Reconnect(); Sevilla - Introducción a Xamarin 4
Reconnect(); Sevilla - Introducción a Xamarin 4Reconnect(); Sevilla - Introducción a Xamarin 4
Reconnect(); Sevilla - Introducción a Xamarin 4
 
.Net Conf Sevilla 2018
.Net Conf Sevilla 2018.Net Conf Sevilla 2018
.Net Conf Sevilla 2018
 
Xamarin REvolve 2016
Xamarin REvolve 2016Xamarin REvolve 2016
Xamarin REvolve 2016
 
Introducción a Xamarin utilizando MVVMCross
Introducción a Xamarin utilizando MVVMCrossIntroducción a Xamarin utilizando MVVMCross
Introducción a Xamarin utilizando MVVMCross
 

Similar a Xamarin Forms: Optimización de rendimiento

DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin FormsDotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin FormsPlain Concepts
 
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Sorey García
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Nelson Rojas Núñez
 
NET MAUI Terasoft.pptx
NET MAUI Terasoft.pptxNET MAUI Terasoft.pptx
NET MAUI Terasoft.pptxLuis775803
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño Ijjegonzalezf
 
Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5Oscar Gensollen
 
Grails: Framework para el desarrollo de aplicaciones Web No 2
Grails: Framework para el desarrollo de aplicaciones Web No 2Grails: Framework para el desarrollo de aplicaciones Web No 2
Grails: Framework para el desarrollo de aplicaciones Web No 2Esteban Saavedra
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a BackboneOscar Gensollen
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Eduard Tomàs
 

Similar a Xamarin Forms: Optimización de rendimiento (20)

DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin FormsDotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms
 
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
 
Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2
 
patron de diseño MVVMo.pptx
patron de diseño MVVMo.pptxpatron de diseño MVVMo.pptx
patron de diseño MVVMo.pptx
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009
 
NET MAUI Terasoft.pptx
NET MAUI Terasoft.pptxNET MAUI Terasoft.pptx
NET MAUI Terasoft.pptx
 
Aplicaciones En Capas
Aplicaciones En CapasAplicaciones En Capas
Aplicaciones En Capas
 
Android Superstar - Buenas Prácticas
Android Superstar - Buenas PrácticasAndroid Superstar - Buenas Prácticas
Android Superstar - Buenas Prácticas
 
Todomir
TodomirTodomir
Todomir
 
Desarrollo de aplicaciones con wpf
Desarrollo de aplicaciones con wpfDesarrollo de aplicaciones con wpf
Desarrollo de aplicaciones con wpf
 
Angular js
Angular jsAngular js
Angular js
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
 
Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5Desarrollo de Aplicaciones Web con ASP.NET MVC5
Desarrollo de Aplicaciones Web con ASP.NET MVC5
 
(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
 
GWT
GWTGWT
GWT
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
Grails: Framework para el desarrollo de aplicaciones Web No 2
Grails: Framework para el desarrollo de aplicaciones Web No 2Grails: Framework para el desarrollo de aplicaciones Web No 2
Grails: Framework para el desarrollo de aplicaciones Web No 2
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a Backbone
 
Iniciación Con CakePHP
Iniciación Con CakePHPIniciación Con CakePHP
Iniciación Con CakePHP
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6
 

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 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
 

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

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
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
 
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.Forms
Introducción a Xamarin.FormsIntroducción a Xamarin.Forms
Introducción a Xamarin.Forms
 
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
 

Xamarin Forms: Optimización de rendimiento

  • 1.
  • 2.
  • 3. Visual Studio Technologies & Windows Platform Development MVP Xamarin MVP Software Developer at Plain Concepts • Blog: http://geeks.ms/blogs/jsuarez • Email: javiersuarezruiz@hotmail.com • Twitter: @jsuarezruiz
  • 4.
  • 6. 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
  • 7. 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
  • 8. • Xamarin.Forms NO es apto para todo tipo de aplicaciones. • Es perfecto para aplicaciones de entrada de datos. • No es lo ideal para aplicaciones visualmente complejas. • Utilizado en fases iniciales de prototipado. • El XAML es diferente al XAML de UWP. • Es un framework aún joven.
  • 9. Xamarin.Forms permite crear aplicaciones complejas con interfaces atractivas. github.com/Microsoft/BikeSharing360_MobileApps 93.7% code share
  • 10. Xamarin.Forms permite crear aplicaciones complejas con interfaces atractivas. github.com/jsuarezruiz/xamarin-forms-goodlooking-UI
  • 11. • Hay que tener en cuenta la capa de abstracción. • No se puede desarrollar absolutamente todo sin pensar en que hay “debajo”. • Hay que utilizar los controles adecuados en cada caso. • El árbol visual debe ser parte de nuestra responsabilidad. • A veces es necesario código nativo en forma de Cunstom Renderers o Effects.
  • 12. XamlC
  • 13. 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.
  • 15. • Xamarin.Forms 0 20 40 60 80 100 120 140 160 Android Tiempo de inicialización Skip Compile  Tiempo calculado con InitializeCompone nt().  Tiempo medio de 5 medidas.  Oneplus 3 con Android 7.1 Nougat.
  • 19. • Binding es una características incluida en Xamarin.Forms. • Permite crear asociaciones entre una Fuente y un destino. • Permite aplicar MVVM descoplando Modelo y Vista interponiendo una capa intermedia, la ViewModel. Propiedad pública BindableProperty Source TargetBinding OneWay TwoWay OneWayToSource
  • 20. 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
  • 22. View
  • 23. • Xamarin.Forms • Una View es un elemento de bajo nivel que representa un nodo en el árbol visual. • Toda View cuenta con una serie de propiedades y eventos. • Ejemplos: Label, Button, etc.
  • 24. La creación de una View en Xamarin.Forms se divide en dos fases: • Inflating: Instanciar la vista. • Rendering: Añadir al árbol visual.
  • 25. public MainView() { var stackLayout = new StackLayout(); stackLayout.Children.Add(new Button() { Text = «Click me!" }); //... }
  • 27. • No especificar las propiedades HorizontalOptions y VerticalOptions con sus valores por defecto. Se desencadenan diferentes ciclos con cálculos innecesarios. • Rendimiento muy superior utilizando TranslationX y TranslationY en lugar de Margin para posicionar. • Evitar modificar la Opacity salvo en casos necesarios. Costoso sobretodo en Android.
  • 29. • Las propiedades bindables VerticalTextAlignment y HorizontalTextAlignment de tipo TextAlignment están optimizadas para posicionar el contenido del Label. <Label Text="Testing" VerticalOptions="Center" HorizontalOptions="Center"/> Label Text="Testing" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
  • 30. • A la hora de manejar texto con formato, el control de tipo Label cuenta con la propiedad bindable FormattedText. Es muchísimo más óptimo que crear un nuevo Layout con multiples controles de tipo Label. <StackLayout Orientation="Horizontal"> <Label Text="Hola " TextColor="Red"/> <Label Text="!" TextColor="Blue"/> </StackLayout> <Label> <Label.FormattedText> <FormattedString> <Span Text="Hola " ForegroundColor="Red"/> <Span Text="!" ForegroundColor="Blue" /> </FormattedString> </Label.FormattedText> </Label>
  • 31. • Es más óptimo utilizar un ImageSource de una imagen desde el sistema de archivos en lugar del archivo de recursos. <Image Source="resource.png"/> <Image> <Image.Source> <FileImageSource File="file.png"/> </Image.Source> </Image>
  • 32. • Desactivar la opacidad. • Transformaciones y reducción de tamaño preferible desde el lado del servidor. • Si no es possible hacer ningún tratamiento desde el lado del servidor, hacerlo en dispositivo. FFImageLoafing, cache y reducción de tamaño. <Image IsOpaque="False"/>
  • 34. • 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"/>
  • 35. • El ListView mantiene un grupo de celdas de iguales dimensiones con el tamaño de la ventana, lo que se conoce como reutilización de celdas. • Opción idónea en una enorme variedad de casos pero no siempre. Por ejemplo, se pueden tener problemas si se utiliza DataTemplateSelector.
  • 36. • Es el valor por defecto para garantizar la compatibilidad con versions anteriores de Xamarin.Forms. • El ListView crea una nueva celda por cada element de la lista.
  • 37. • 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!
  • 38. <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>
  • 39. • 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.
  • 42. • 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.
  • 43. 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”.
  • 44. SiNo
  • 45. • La invalidación de un Layout puede lanzarse por diferentes motivos. Cada motive viene indicado en el enumerado InvalidationTrigger. public enum InvalidationTrigger { Undefined = 0, MeasureChanged = 1 << 0, HorizontalOptionsChanged = 1 << 1, VerticalOptionsChanged = 1 << 2, SizeRequestChanged = 1 << 3, RendererReady = 1 << 4, MarginChanged = 1 << 5 }
  • 47. • El ciclo de Layout termina con la llamada a Layout() del ultimo elemento. • A diferencia del ciclo de validación, no es possible controlar el ciclo de Layout.
  • 48. 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.
  • 49. 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>
  • 50. 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>
  • 51. 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>
  • 52. 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.
  • 53. 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>
  • 54. ” No uses un StackLayout para un único hijo No uses un Grid cuando el StackLayout hace el trabajo No uses varios StackLayout cuando un Grid cumple ” Jason Smith - Evolve 2016
  • 55. 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.
  • 58. Hablamos de cambios realizados en Xamarin.Forms con el objetivo de reducir a mínimos de operaciones y cálculos a realizar para renderizar el control y gestionar su tamaño y posición.
  • 62. • Xamarin.Forms 0 100 200 300 400 500 600 700 800 900 1000 Android Tiempo de inicialización Fast No Fast  Tiempo calculado con InitializeComponent().  Tiempo medio de 5 medidas.  Oneplus 3 con Android 7.1 Nougat.
  • 64. Siempre tendremos DOS PARTES: El Elemento y el Renderer Element describe la apariencia del control Button Text TextColor … Renderer crea una visualización específica para cada plataforma ButtonRenderer ButtonRenderer ButtonRenderer Button Button MyButtonRenderer UIImage
  • 65. Crear la definición en el proyecto Shared/PCL public class CustomControl : View { }
  • 66. Implementar un renderer por cada plataforma public class CustomControlRenderer : ViewRenderer<CustomControl, View> { }
  • 67. • Se suele cometer un fallo típico al realizar la suscripción de eventos en el renderer y nunca eliminar la suscripción. protected override void OnElementChanged(ElementChangedEventArgs<View> e) { if (e.NewElement != null) { if (Control != null) { _button = new Button(); _button.Click += OnButtonClick; } } } protected override void OnElementChanged(ElementChangedEventArgs<Button> e) { if (e.OldElement != null) { if (Control != null) { _button.Click -= OnButtonClick; } } }
  • 68. protected override void OnElementChanged (ElementChangedEventArgs<View> e) { base.OnElementChanged (e); if (Control == null) { // Se instancia el control nativo y se asignan las propiedades básicas } if (e.OldElement != null) { // Eliminamos la suscrición de eventos y hacemos limpieza de recursos, etc. } if (e.NewElement != null) { // Configura el control y realiza la suscripción de eventos } }
  • 69. ¿Impacta?  Se consume memoria que no se vuelve a recuperar.  Si el control es muy usado y entran en juego navegación y otros factores, el impacto puede ser notorio (hablamos de MBs!).
  • 71. Un Behavior espera por “algo” para hacer “algo”. Un Behavior espera por “algo”. Puede ser un evento que se lanza, el cambio de una propiedad o cualquier otra acción personalizada que deseamos monitorear. Una vez que ese “algo” se desencadena, el Behavior puede hacer acciones muy variadas, desde cambiar el valor de una propiedad, lanzar un evento, hacer verificaciones o validaciones, etc.
  • 72. Veamos un ejemplo. public class NumericEntryBehavior : Behavior<Entry> { private string _lastValidText; protected override void OnAttachedTo(Entry bindable) { bindable.TextChanged += EntryTextChanged; base.OnAttachedTo(bindable); } private void EntryTextChanged(object sender, EventArgs e) { var entry = sender as Entry; if (entry != null) { double value; if (string.IsNullOrEmpty(entry.Text) || Double.TryParse(entry.Text, out value)) { _lastValidText = entry.Text; return; } entry.Text = _lastValidText; } } }
  • 74. • Se suele cometer un fallo típico al realizar la suscripción de eventos junto a inicialización de elementos y nunca eliminar la suscripción o hacer limpieza de recursos. protected override void OnAttachedTo(Entry bindable) { bindable.TextChanged += EntryTextChanged; base.OnAttachedTo(bindable); } protected override void OnAttachedTo(Entry bindable) { bindable.TextChanged += EntryTextChanged; base.OnAttachedTo(bindable); } protected override void OnDetachingFrom(Entry bindable) { bindable.TextChanged -= EntryTextChanged; base.OnDetachingFrom(bindable); }
  • 75. Otros
  • 76. • AOT en lugar de JIT reduce los tiempos de arranque (aunque incrementa el tamaño del paquete). • Es una buena práctica utilizar App.xaml para gestionar los recursos a nivel de aplicación. No lo es tanto añadir absolutamente todos los recursos. Son cargados en el arranque de la App. Analiza si se reutilizan y son necesarios los recursos, etc. • Revisa el conjunto de dependencias de la aplicación. En ocasiones hay dependencias innecesarias, pruebas, etc. • Las imágenes suelen ser un costo elevado. Reduce lo máximo posible las imágenes locales de la aplicación Herramientas como TinyPic pueden llegar a reducir hasta un 80% tamaños. • Realiza thumbnails de imágenes y utiliza cache. FFImageLoading permite ambas opciones.

Notas del editor

  1. https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/behaviors/introduction/