Xamarin.Forms Performance Reminder - Fast Renderers

Xamarin Development

6 years ago

This post is first of a series of "reminders" that will help your Xamarin.Forms apps become as performant as possible. This time we will use Fast Renderers to squeeze additional performance from our apps when running on Android. Xamarin

What are Fast Renderers?

Xamarin.Forms controls are displayed in native view using Renderers. Absolute most of the Xamarin.Forms Android renderers derive from ViewRenderer<TView, TNativeView> class which is defined as follows:

public abstract class ViewRenderer<TView, TNativeView> : VisualElementRenderer<TView>, IViewRenderer, ITabStop, AView.IOnFocusChangeListener 
        where TView : View 
        where TNativeView : AView

Diving further, VisualElementRenderer<TElement> is defined as:

public abstract class VisualElementRenderer<TElement> : FormsViewGroup, IVisualElementRenderer, IEffectControlProvider 
        where TElement : VisualElement

Here FormsViewGroup is actually just a customized Xamarin.Forms class derived from ViewGroup. The actual native Android view (like a Button) gets embedded in this outer ViewGroup. This is done to supply additional "global" behavior of most controls like padding, gesture handling, etc., but it also has clear performance impact - every control you create in fact generates two views in Android's view hierarchy. This is fine for simpler app pages, but for complex and large lists, this might become a serious performance bottleneck. Luckily, Fast Renderers are here for the rescue. When you enable Fast Renderers for your project, they will automatically replace the default renderers for the most common controls:

  • Button

  • Image

  • Label

  • Frame

    Fast Renderers no longer derive from ViewRenderer<TView, TNativeView> and instead handle all layout and gesturing on the native control itself. For an example see the Fast Renderer for Button here on GitHub.

How to enable Fast Renderers?

Fast Renderers are an experimental feature and are not enabled by default. You can enable them for the whole project by putting the following line of code before Forms.Init() in your Android project head's MainActivity:

Forms.SetFlags("FastRenderers_Experimental");

Internally the flag for Fast Renderers is set and then initialized during LoadApplication in FormsAppCompatActivity as seen here in the source code. It is important to note that Fast Renderers are only compatible with app compat activity and will have effect only on Android.