در این قسمت قصد داریم به بررسی نحوهی بهبود Performance در پروژههای Xamarin Forms نگاهی بیاندازیم. صد البته امکان پوشش دادن تمامی نکات وجود ندارد و در این قسمت سعی بر پوشش دادن مهمترین آنها را داریم.
توجه داشته باشید که در
قسمت نهم به "x:DataType" و در
قسمت چهارم به "مواردی مهم در زمینهی بهبود عملکرد پروژههای Xamarin در Android" پرداخته بودیم که آن نکات در بهبود سرعت برنامهها تاثیر گذارند. همان طور که در
قسمت چهارم گفته شد، همیشه سرعت برنامه را در Release mode تست کنید.
در Xamarin Forms هر کنترل (برای مثال Entry و Button) در زمان اجرا به یک کنترل Native معادل خود تبدیل میشود. مشکلی که وجود دارد این است که وقتی از روی Button مربوط به Xamarin Forms، یک Button در Android و ... ساخته میشود، آن Button بر روی یک Container قرار میگیرد. در واقع به ازای هر کنترل Xamarin Forms، دو کنترل Native ساخته میشود(!) و تعداد کنترلهای بیشتر در برنامه یعنی کندی بیشتر.
وظیفه تبدیل Xamarin forms control به یک Native control بر عهده
Renderer هاست. البته اینکه هر Xamarin Forms control به دو Native control تبدیل شود در ذیل بحث
Fast Renderers در حال بهبود یافتن است. Fast Renderer یک Renderer است که به ازای هر Xamarin forms control، فقط یک کنترل Native را میسازد.
راهنمای فعال سازی Fast Renderers را میتوانید بخوانید و در برنامههایتان اعمال کنید؛ ولی در پروژههای مبتنی بر Bit مانند XamApp، این مهم به صورت خودکار فعال میشود و نیازی به اقدام جداگانهای نیست.
مورد بعدی در مورد Layoutهای Xamarin Forms است (Grid,StackLayout,FlexLayout و...) در صورتیکه قصد تعریف کردن مواردی چون Tap Gesture و Background را بر روی Layout خود ندارید و از Layout خود فقط انتظار Layout بودن را دارید، میتوانید آنها را سریعتر سازید. مثال قسمت قبل را که برای نمایش هر Product در List View از Flex Layout استفاده میکرد، بهخاطر بیاورید. ما آن Flex را استفاده کردیم تا نام Product، بیست و پنج درصد فضای هر ردیف از List View را بگیرد و ... به آن Flex Layout رنگی داده نشد یا هر چیزی از این قبیل. برای بهبود عملکرد آن List View میتوانیم از Flex Layout به شکل زیر استفاده کنیم:
<sfListView:SfListView.ItemTemplate>
<DataTemplate>
<FlexLayout
x:DataType="model:Product"
CompressedLayout.IsHeadless="True"
Direction="Row">
<Label
FlexLayout.Basis="40%"
Text="{Binding Name}"
VerticalTextAlignment="Center" /> ...
با اضافه کردن
CompressedLayout.IsHeadless=True دیگر کنترل Native ای برای آن Flex Layout ساخته نمیشود و کنترل Native کمتر یعنی سرعت بیشتر برنامه.
برای این امکان، ذکر دو نکته الزامی است:
۱- استفاده از CompressedLayout.IsHeadless باعث میشود تعدادی از امکانات Layout مانند Background Color دیگر کار نکنند. فعال سازی آن فقط در DataTemplateهای ListView توصیه میشود که مثلا 20 عدد Product در مثال قسمت قبل، منجر به ساخته شدن 20 عدد Flex Layout میشوند و اگر کاری کنیم که کنترل Native معادل آن ساخته نشود، لااقل 20 بار سود کردهایم! استفاده کردن از CompressLayout در همه جای برنامه، ایده جالبی نیست.
۲- CompressedLayout فقط در Android و iOS اعمال میشود و تست کردن آن در UWP عملا فایدهای ندارد.
نکته مهم بعدی، بحث نمایش عکس است. در Xamarin Forms یک عکس میتواند در رزولوشنهای مختلف با کمک Drawable در Android و Asset Catalog Image Sets در iOS و ... باشد. همچنین میتوان عکس را از یک Url گرفت و یا به شکل Embedded در پروژهی مشترک بین سه پلتفرم باشد. میتوان علاوه بر PNG و JPG از WebP ،SVG و GIF نیز استفاده نمود. اما آنچه که مهم است این است که بعد از یادگیری
اصول اولیه نمایش عکس در Xamarin Forms، حتما حتما از
FF Image Loading برای نمایش عکسها استفاده شود.
استفاده از FF Image Loading دارای مزایایی چون پشتیبانی از WebP | SVG است. همچنین این کتابخانه فایلها را نیز Cache میکند (هم در صورتیکه Url باشند و قرار باشند از طریق اینترنت دریافت شوند و هم Bitmap حاصل از Render کردن آن عکس برای آن Device خاص همانند GlideX در Android). امکان گرد کردن عکس، یا سیاه و سفید نمودن آن و کوهی از امکانات دیگر، استفادهی از این کتابخانه را الزامی میکند!
برای نمایش لوگوی Bit در برنامه برای مثال، ابتدا
Package مربوطه را در پروژه XamApp نصب میکنیم. سپس آن را در Android ،iOS و UWP
راه اندازی میکنیم و در Android مقدار enableFastRenderer را True میدهیم. سپس در Xaml داریم:
<ffimageloading:CachedImage
CacheType="All"
DownsampleToViewSize="true"
HeightRequest="100"
HorizontalOptions="Center"
Source="https://avatars2.githubusercontent.com/u/22663390?s=100"
VerticalOptions="Center"
WidthRequest="100" />
پایان