Xamarin Forms FastRenderers

Introducción

Recientemente se liberaba la versión 2.3.5 de Xamarin.Forms donde entre las diferentes novedades, destaca la aparición de FastRenderers y la mejora de rendimiento. Por ahora, sólo disponible en Android e incluido en los controles Label, Button, Frame e Image. Pero.. ¿qué son los Fast Renderers?, ¿por qué se habla de mejora de rendimiento?.

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.

FastRenderers

Por un lado se ha simplificado notablemente el conjunto de clases implicadas para realizar los cálculos necesarios para el renderizado, tamaño y posición. Previamente, un Label en Xamarin.Forms al ejecutarse en Android realizaba:

Ahora:

Se reduce el número de participantes llegando de forma mucho más directa al renderizado. Se sigue implementando la interfaz IVisualElementRenderer que permite tener los métodos OnElementChanged y OnElementPropertyChanged.

Hasta este punto, a pesar de reducir piezas en la lógica, no se ve una reducción drástica en el ciclo del Layout. También se han realizado importantes modificaciones en el ciclo del Layout. Previamente:

  • OnLayout de la clase LabelRenderer
    • OnLayout de ViewRenderer
    • MeasureAndLayout de ViewRenderer
      • OnLayout de VisualElementRenderer
        • UpdateLayout del control

Ahora:

  • On Layout de la clase LabelRenderer
    • OnLayout View

Además, mientras que antes todos los parámetros del Layout se actualizaban (OJO: Opacity, Rotation, Scale, etc) ahora se establecen todas una vez. Tambien se añaden validaciones para evitar refrescos del Layout innecesarios (Invalidate).

NOTA: Se mantienen también los renderers anteriores de los controles Label, Image, Frame y Button por compatibilidad hacia atrás.

Comparativa de rendimiento

Dependiendo del Layout y controles utilizados en la aplicación, la mejora de rendimiento se notará en mayor o menor medida. Hablamos desde un pequeño porcentaje hasta en según que ocasiones practicamente duplicar el rendimiento.

Para profundizar en este aspecto, vamos a crear un ejemplo con dos pruebas. Realizaremos una prueba básica donde tendremos una vista con 50 Buttons y 50 Labels. Recuerda, actualmente se han añadido FastRenderers de ButtonRenderer, FrameRenderer, LabelRenderer y ImageRenderer. La segunda prueba será un listado con cientos de elementos donde la plantilla que define cada fila utilizará un control de tipo Image, y dos Labels.

El ejemplo se encuentra disponible en GitHub:

Ver GitHub

Se utiliza Stopwatch para realizar medidas de tiempo de renderizado además de pruebas con la experiencia al hacer scroll en el listado, etc. Cambiando el paquete de Xamarin.Forms de versiones previas a la versión 2.3.5 o superior podemos hacer diferentes comparativas. Se aprecian mejores resultados en los tiempos (946ms > 708ms en el ejemplo básico). Te animo a descargar el ejemplo y a realizar tus propias medidas.

No cabe duda que en futuras versiones de Xamarin.Forms nos esperan más y más renderers utilizando FastRenderers lo que al final, nos afecta como desarrolladores, en una ganancia de rendimiento sin necesidad de trabajo extra.

Más información

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *