Výkonnostní tip pro Xamarin.Forms - Fast Renderers

Xamarin Development

5 years ago

Tento článek je prvním ze série "připomenutí" která vám pomohou udělat vaši aplikaci co nejvýkonnější. Dnes se podíváme na Fast Renderers, které pomohou optimalizovat běh aplikace na Androidu. Xamarin

Co jsou Fast Renderers?

Ovladací prvky v Xamarin.Forms se zobrazují v nativním prostředí pomocí konceptu Renderers. Drtivá většina Android Renderers dědí od třídy ViewRenderer<TView, TNativeView> která je definována jako:

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

Jdeme-li hlouběji, zjistíme, že VisualElementRenderer<TElement> je definována jako:

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

Zde je FormsViewGroup jen lehce upravená Xamarin.Forms verze nativní třídy ViewGroup. Skutečný nativní view (jako Button) je uvnitř tohoto vnějšího ViewGroup. Tímto způsobem je možné snadno a univerzálně dát všem ovladacím prvkům "univerzální" chování jako padding, zpracování gest a jiné. Má to však i výkonnostní dopad - každý ovladací prvek který vytvoříte vygeneruje dvě view v hierarchii Androidu. Ačkoliv to není problém v jednoduchých stránkách aplikace, v případě velkých a složitých seznamů se to stává výraznějším problémem. Naštěstí nás mohou zachránit Fast Renderers. Když ve svém projektu povolíme Fast Renderers, nahradí automaticky výchozí renderery pro nejčastěji používané ovladací prvky:

  • Button

  • Image

  • Label

  • Frame

    Fast Renderers již nedědí od ViewRenderer<TView, TNativeView> a namísto toho zpracovávají layout a gesta přímo pomocí nativního view. Pro příklad se můžete podívat na implementace Fast Rendereru pro Button zde na GitHubu.

Jak povolit Fast Renderers?

Fast Renderers jsou experimentální funkcí a nejsou automaticky povoleny. Můžete je zapnout pro celý projekt přidáním následujícího řádku kódu před voláníForms.Init() v MainActivity vašeho Android projektu:

Forms.SetFlags("FastRenderers_Experimental");

Uvnitř frameworku se takto nastaví flag, který se následně kontroluje uvnitř metody LoadApplication ve FormsAppCompactActivity jak lze vidět zde ve zdrojovém kódu. Je důležité zmínit, že Fast Renderers jsou kompatibilní pouze s app compat aktivitou a mají vliv pouze na Androidu.