Мы пытаемся выпустить некоторые продуктивные приложения с помощью Xamarin.Forms, но одной из наших основных проблем является общая медлительность между нажатием кнопки и отображением содержимого. После нескольких экспериментов мы обнаружили, что даже простая ContentPage
с 40 ярлыками занимает более 100 мс для отображения:
public static class App
{
public static DateTime StartTime;
public static Page GetMainPage()
{
return new NavigationPage(new StartPage());
}
}
public class StartPage : ContentPage
{
public StartPage()
{
Content = new Button {
Text = "Start",
Command = new Command(o => {
App.StartTime = DateTime.Now;
Navigation.PushAsync(new StopPage());
}),
};
}
}
public class StopPage : ContentPage
{
public StopPage()
{
Content = new StackLayout();
for (var i = 0; i < 40; i++)
(Content as StackLayout).Children.Add(new Label{ Text = "Label " + i });
}
protected override void OnAppearing()
{
((Content as StackLayout).Children[0] as Label).Text = "Stop after " + (DateTime.Now - App.StartTime).TotalMilliseconds + " ms";
base.OnAppearing();
}
}
Особенно на Android все хуже, чем больше ярлыков, которые вы пытаетесь отобразить. Первое нажатие кнопки (что важно для пользователя) даже занимает ~ 300 мс. Нам нужно показать что-то на экране менее чем за 30 мс, чтобы создать хороший пользовательский интерфейс.
Зачем так долго с Xamarin.Forms
отображать некоторые простые метки? И как обойти эту проблему для создания shippable App?
<сильные > Эксперименты
Код можно разветкить на GitHub в https://github.com/perpetual-mobile/XFormsPerformance
Я также написал небольшой пример, демонстрирующий, что аналогичный код, использующий собственные API от Xamarin.Android, значительно быстрее и не становится медленнее при добавлении большего количества контента: https://github.com/perpetual-mobile/XFormsPerformance/tree/android-native-api