Aracılığıyla paylaş


WinUI uygulamanızın başlangıç performansı için en iyi yöntemler

Başlangıç çalışmasını azaltarak, ilk kareyi basitleştirerek ve pencere etkileşimli olduktan sonra kritik olmayan özellikleri yükleyerek hızlı bir şekilde başlayan Windows Uygulama SDK'sı ile WinUI uygulamaları oluşturun.

Uygulamanızın başlangıç performansı için en iyi yöntemler

Kısmen, kullanıcılar uygulamanızın ne kadar sürede başlatıldığına bağlı olarak onun hızlı mı yoksa yavaş mı olduğunu algılar. Bu konu başlığında, bir uygulamanın başlangıç zamanı, kullanıcı uygulamayı başlattığında başlar ve kullanıcı uygulamayla anlamlı bir şekilde etkileşim kurabildiğinde sona erer. Bu makalede, Bir WinUI uygulamasından daha iyi başlangıç performansı elde etme hakkında öneriler sağlanır.

Uygulamanızın başlangıç süresini ölçme

Başlangıç zamanını ölçmeden önce uygulamanızı birkaç kez başlattığınızdan emin olun. Bu size ölçümünüz için bir temel sağlar ve başlangıç süresini mümkün olduğunca kısa sürede ölçmenize yardımcı olur.

Son kullanıcının neler yaşayacağını temsil eden ölçümler alın. Sürüm derlemelerini temsili donanıma göre ölçün, hem soğuk hem de sıcak başlatmayı inceleyin ve yalnızca işlemin var olduğu zamana değil, ilk etkileşimli çerçeveye ulaşma süresine odaklanın.

Çalışmayı mümkün olduğunca uzun süre erteleme

Uygulamanızın başlangıç süresini geliştirmek için yalnızca kullanıcının uygulamayla etkileşime başlamasına izin vermek için yapılması gereken işi yapın. Ek derlemelerin yüklenmesini geciktirebilirseniz bu özellikle yararlı olabilir. Ortak dil çalışma zamanı, ilk kez kullanıldığında bir derleme yükler. Yüklenen derleme sayısını en aza indirebiliyorsanız uygulamanızın başlangıç süresini ve bellek tüketimini geliştirebilirsiniz.

Uzun süre çalışan işleri bağımsız olarak yapın

Uygulamanın tam olarak işlevsel olmayan bölümleri olsa da uygulamanız etkileşimli olabilir. Örneğin, uygulamanız alınması biraz zaman alan veriler görüntülüyorsa, verileri zaman uyumsuz olarak alarak bu kodun uygulamanın başlangıç kodundan bağımsız olarak yürütülmesini sağlayabilirsiniz. Veriler kullanılabilir olduğunda, uygulamanın kullanıcı arabirimini verilerle doldurun.

Veri alan API'lerin çoğu asenkron olduğundan, yine de verileri asenkron olarak alırsınız. Daha fazla bilgi için bkz. Async ve await ile zaman uyumsuz programlama. Zaman uyumsuz API'ler kullanmayan bir iş yapıyorsanız, kullanıcının uygulamayla etkileşim kurmasını engellememek için uzun süreli işlemler yapmak üzere Task sınıfını kullanabilirsiniz. Bu, veriler yüklenirken uygulamanızın yanıt vermesini sağlar.

Uygulamanızın kullanıcı arabiriminin bir kısmını yüklemesi özellikle uzun sürüyorsa, kullanıcılarınızın uygulamanın işlemeye devam ettiğini bilmesi için bu alanda "En son verileri alma" gibi bir ileti göstermeyi göz önünde bulundurun.

Başlangıç süresini en aza indirme

En basit uygulamalar dışında tüm uygulamalar kaynakları yüklemek, XAML'yi ayrıştırmak, veri yapılarını ayarlamak ve başlatma sırasında mantık çalıştırmak için algılanabilir bir süre gerektirir. WinUI uygulamaları için başlatmayı dört aşamada düşünmek yardımcı olur: işlem başlatma, pencere oluşturma, ana sayfa oluşturma ve ilk kare için düzen/işleme.

Başlangıç dönemi, kullanıcının uygulamayı başlattığı an ile uygulamanın işlevsel hale geldiği an arasındaki süredir. Bu kritik bir zamandır çünkü bu, bir kullanıcının uygulamanızla ilgili ilk izlenimidir. Kullanıcılar sistemden ve uygulamalardan anında ve sürekli geri bildirim bekler. Sistem ve uygulama, uygulamalar hızlı başlatılmadığında bozuk veya kötü tasarlanmış olarak algılanır.

Başlangıç aşamalarına giriş

Başlangıç, bir dizi hareketli parça içerir ve bunların tümünün en iyi kullanıcı deneyimi için koordine edilmesi gerekir. Aşağıdaki adımlar, uygulamanızı başlatan kullanıcı ile gösterilen uygulama içeriği arasında gerçekleşir.

  • İşlem başlatılır ve şablon tarafından oluşturulan başlangıç kodu Main çağırır.
  • Application Nesnesi oluşturulur.
    • Uygulama oluşturucu InitializeComponent öğesini çağırır, bu da App.xaml'in ayrıştırılmasına ve nesnelerin oluşturulmasına neden olur.
  • Application.OnLaunched oluşturulur.
    • Uygulama kodu ana pencereyi oluşturur, ilk içeriği atar ve Activate çağırır.
    • Ana sayfa oluşturucu, sayfa XAML'sinin ayrıştırılması ve nesnelerin oluşturulmasına neden olan öğesini çağırır InitializeComponent.
  • XAML çerçevesi, ölçme ve yerleştirme dahil olmak üzere düzen adımını çalıştırır.
    • ApplyTemplate , her denetim için denetim şablonu içeriğinin oluşturulmasına neden olur. Bu, genellikle başlangıç sırasında düzen süresinin büyük bir kısmıdır.
  • Render, pencere içeriğinin görsellerini oluşturur.
  • İlk çerçeve sunulur ve başlatma sonrası işlemler eşzamansız olarak devam eder.

Başlangıç yolunuzda daha az işlem yapın

Başlangıç kodu yolunuzu ilk çerçeveniz için gerekli olmayan her şeyden uzak tutun.

  • İlk çerçeve sırasında gerekli olmayan denetimleri içeren kullanıcı DLL'leriniz varsa, bunları gecikmeli yüklemeyi göz önünde bulundurun.
  • Kullanıcı arabiriminizin buluttan alınan verilere bağlı bir bölümünüz varsa bu kullanıcı arabirimini bölün. İlk olarak, bulut verilerine bağımlı olmayan kullanıcı arabirimini açın ve ardından zaman uyumsuz olarak buluta bağımlı kullanıcı arabirimini açın. Uygulamanın çevrimdışı çalışabilmesi veya yavaş ağ bağlantısından etkilenmemesi için verileri yerel olarak önbelleğe almayı da göz önünde bulundurmalısınız.
  • Kullanıcı arabiriminiz veri bekliyorsa, ilerleme durumunu gösteren kullanıcı arabirimini gösterin.
  • Yapılandırma dosyalarının çok fazla ayrıştırılmasını veya kod tarafından dinamik olarak oluşturulan kullanıcı arabirimini içeren uygulama tasarımlarına dikkat edin.

Öğe sayısını azaltma

Bir XAML uygulamasındaki başlangıç performansı, başlatma sırasında oluşturduğunuz öğe sayısıyla doğrudan ilişkilendirilir. Ne kadar az öğe oluşturursanız, uygulamanızın başlatılması o kadar kısa sürer. Kaba bir karşılaştırma olarak, her öğenin oluşturulmasının 1 ms süreceğini düşünün.

  • Öğe denetimlerinde kullanılan şablonlar birden çok kez tekrarlandığından en büyük etkiye sahip olabilir. Bkz. ListView ve GridView kullanıcı arabirimi iyileştirme.
  • UserControls ve denetim şablonları genişletilir, bu nedenle bunlar da dikkate alınmalıdır.
  • Ekranda görünmeyen bir XAML oluşturursanız, bu XAML parçalarının başlatma sırasında oluşturulup oluşturulmayacağını gerekçelendirmeniz gerekir.

Visual Studio Canlı Görsel Ağaç penceresi, ağaçtaki her düğüm için alt öğe sayılarını gösterir.

Canlı görsel ağaç.

Ertelemeyi kullanın. Bir öğenin daraltılması veya opaklığının 0 olarak ayarlanması, öğenin oluşturulmasını engellemez. veya x:Loadkullanarakx:DeferLoadStrategy, bir kullanıcı arabirimi parçasının yüklenmesini geciktirebilir ve gerektiğinde yükleyebilirsiniz. Bu, gerektiğinde veya gecikmeli bir mantık kümesinin parçası olarak yükleyebilmeniz için başlatma sırasında görünür olmayan kullanıcı arabirimini işlemeyi geciktirmek için iyi bir yoldur. Yüklemeyi tetiklemek için yalnızca FindName öğesini çağırmanız gerekir. Örnek ve daha fazla bilgi için bkz. x:Load özniteliği ve x:DeferLoadStrategy özniteliği.

Sanallaştırma. Kullanıcı arabiriminizde liste veya yineleyici içeriğiniz varsa, kullanıcı arabirimi sanallaştırması kullanmanız kesinlikle önerilir. Liste kullanıcı arabirimi sanallaştırılmamışsa, tüm öğeleri ön sırada oluşturmanın maliyetini ödersiniz ve bu da başlatmanızı yavaşlatabilir. Bkz. ListView ve GridView kullanıcı arabirimi iyileştirme.

Uygulama performansı yalnızca ham performansla ilgili değildir; Aynı zamanda algıyla da ilgili. görsel yönlerinin ilk olarak gerçekleşmesi için işlemlerin sırasını değiştirmek, kullanıcının uygulamanın daha hızlı olduğunu hissetmesine neden olur. Kullanıcılar, içerik ekrandayken uygulamanın yüklendiğini düşünür. Uygulamaların genellikle başlangıç sırasında birden çok şey yapması gerekir ve bu işin tümünün kullanıcı arabirimini açmak için gerekli olmaması gerekir, bu nedenle bu parçaların kullanıcı arabiriminden daha düşük gecikmeli veya önceliklendirilmiş olması gerekir.

Bu makale, animasyon ve video terminolojisinden gelen ve içeriğin son kullanıcı tarafından görülmesinin ne kadar sürdüğünü gösteren ilk kareden bahseder.

Girişim algısını geliştirme

Başlangıç aşamasının her aşamasını ve süreç boyunca kullanıcıya geri bildirim sağlamak için farklı teknikleri tanımlamak için basit bir çevrimiçi oyun örneğini kullanalım.

İlk aşamada işlem başlatılır ve uygulama penceresini oluşturur. Bu süre boyunca kullanıcı uygulamanın kendi içeriğini henüz görmedi. Amacınız hızlı bir şekilde ekranda hafif bir pencere almaktır.

İkinci aşama, oyun için kritik olan yapıların oluşturulmasını ve başlatılmasını kapsar. Uygulama başlatma sırasında sağlanan verilerle ilk kullanıcı arabirimini hızlı bir şekilde oluşturabiliyorsa, bu aşama önemsizdir ve kullanıcı arabirimini hemen görüntüleyebilirsiniz. Aksi takdirde, uygulama başlatılırken basit bir yükleme sayfası görüntüleyin.

Yükleme sayfasının nasıl göründüğü size bağlı; ilerleme çubuğu veya ilerleme halkası görüntülemek kadar basit olabilir. Önemli nokta, uygulamanın tam olarak yanıt vermeden önce iş gerçekleştirdiğini gösterdiğidir. Oyun söz konusu olduğunda, ilk ekran bazı görüntülerin ve seslerin diskten belleğe yüklenmesini gerektirir. Bu görevler zaman alır, bu nedenle uygulama oyunun temasıyla ilgili basit bir animasyon içeren bir yükleme sayfası göstererek kullanıcıyı bilgilendirır.

Üçüncü aşama, oyunun yükleme sayfasının yerini alan etkileşimli bir kullanıcı arabirimi oluşturmak için minimum bilgi kümesine sahip olduktan sonra başlar. Bu noktada, çevrimiçi oyun için kullanılabilen tek bilgi, uygulamanın diskten yüklediğini içerik olabilir. Oyun, etkileşimli bir kullanıcı arabirimi oluşturmak için yeterli içerikle birlikte gönderilebilir, ancak çevrimiçi bir oyun olduğundan, İnternet'e bağlanana ve bazı ek bilgileri indirene kadar tam olarak işlevsel olmayacaktır. Kullanıcı, ihtiyaç duyduğu tüm bilgilere sahip olana kadar kullanıcı kullanıcı arabirimiyle etkileşimde bulunabilir, ancak web'den ek verilere ihtiyaç duyan özellikler içeriğin yüklenmeye devam ettiğini belirten geri bildirimde bulunabilir. Bir uygulamanın tamamen işlevsel hale gelmesi biraz zaman alabilir, bu nedenle işlevselliğin mümkün olan en kısa sürede kullanıma sunulması önemlidir.

Çevrimiçi oyunda başlatmanın üç aşamasını belirlediğimize göre, şimdi bunları gerçek koda bağlayalım.

1. Aşama ve 2. Aşama

Uygulamanın oluşturucusunu yalnızca uygulama için kritik olan veri yapılarını başlatmak için kullanın. Uygulamanın hemen geri bildirim gösterebilmesi için ilk pencereyi hızlı bir şekilde oluşturmaya, basit içerik atamaya ve pencereyi etkinleştirmeye odaklanın OnLaunched .

public partial class App : Application
{
    public static Window MainWindow { get; private set; } = null!;

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        base.OnLaunched(args);

        MainWindow = new MainWindow();
        MainWindow.Content = new LoadingPage();
        MainWindow.Activate();

        _ = InitializeAsync();
    }

    private async Task InitializeAsync()
    {
        // Asynchronously restore state and load the minimum data needed
        // to create the first interactive UI.
        await LoadInitialDataAsync();

        MainWindow.Content = new GameHomePage();
    }

    private static Task LoadInitialDataAsync()
    {
        // Download data to populate the initial UI.
        return Task.CompletedTask;
    }
}

OnLaunched'daki önemli görevlerden biri bir kullanıcı arabirimi oluşturmak, bunu Window.Content'e atamak ve ardından Window.Activate'ı çağırmaktır. Birden fazla etkinleştirme akışına ihtiyacınız varsa, aynı ilkeyi koruyun: basit içeriği hızla gösterin ve pahalı işleri kritik başlangıç yolundan taşıyın.

Başlatma sırasında yükleme sayfası görüntüleyen uygulamalar arka planda ana kullanıcı arabirimi oluşturmak için çalışmaya başlayabilir. Bu öğe oluşturulduktan sonra FrameworkElement.Loaded olayı gerçekleşir. Olay işleyicisinde, pencerenin şu anda yükleme ekranı olan içeriğini yeni oluşturulan giriş sayfasıyla değiştirebilirsiniz.

Uzun başlatma süresine sahip bir uygulamanın yükleme sayfası göstermesi kritik önem taşır. Başlangıç işlemi hakkında geri bildirim sağlamanın yanı sıra, kullanıcıların uygulamanın ilerleme kaydettiğini görmesi için pencerenin hızla etkinleştirilmesi gerekir.

partial class GameHomePage : Page
{
    public GameHomePage()
    {
        InitializeComponent();

        // Add a handler to be called when the home page has been loaded.
        Loaded += GameHomePageLoaded;

        // Load the minimal amount of image and sound data from disk necessary
        // to create the home page.
    }

    private void GameHomePageLoaded(object sender, RoutedEventArgs e)
    {
        // Set the content of the main window to the home page now that it's
        // ready to be displayed.
        App.MainWindow.Content = this;
    }
}

3. Aşama

Uygulamanın kullanıcı arabirimini görüntülemesi tamamen kullanıma hazır olduğu anlamına gelmez. Oyunumuzda kullanıcı arabirimi, İnternet'ten veri gerektiren özellikler için yer tutucularla birlikte görüntülenir. Bu noktada oyun, uygulamanın tamamen işlevsel olması için gereken ek verileri indirir ve veriler alınırken özellikleri aşamalı olarak etkinleştirir.

Bazen başlangıç için gereken içeriğin çoğu uygulamayla birlikte paketlenebilir. Basit bir oyunda böyle bir durum söz konusudur. Bu, başlangıç işlemini oldukça basit hale getirir. Ancak haber okuyucular ve fotoğraf görüntüleyiciler gibi birçok programın işlevsel hale gelmesi için web'den bilgi çekmesi gerekir. Bu veriler büyük olabilir ve indirilmesi makul bir zaman alabilir. Uygulamanın bu verileri başlatma sırasında nasıl aldığı algılanan performans üzerinde büyük bir etkiye sahip olabilir.

Bir uygulama, başlatmanın ilk veya ikinci aşamasında işlev için ihtiyaç duyduğu bir veri kümesinin tamamını indirmeye çalıştıysa, yükleme sayfasını çok uzun süre görüntüleyebilirsiniz. Bu, bir uygulamanın kilitlendiğini gösterir. Bir uygulamanın 2. aşamada yer tutucu öğeleri içeren etkileşimli bir kullanıcı arabirimini göstermek için gereken en düşük miktarda veriyi indirmesini ve ardından 3. aşamada yer tutucu öğelerinin yerini alan verileri aşamalı olarak yüklemesini öneririz. Verilerle ilgili daha fazla bilgi için bkz. ListView ve GridView'ı İyileştirme.

Bir uygulamanın başlatmanın her aşamasına tam olarak nasıl tepki verdiği tamamen size aittir, ancak basit başlangıç kullanıcı arabirimini kullanarak, ekranları yükleyerek ve aşamalı veri yükleme yoluyla kullanıcıya mümkün olduğunca fazla geri bildirim sağlamak uygulamanın daha hızlı hissetmesini sağlar.

Başlangıç yolundaki yönetilen derlemeleri en aza indirin

Yeniden kullanılabilir kod genellikle bir projeye dahil edilen modüller (DLL' ler) biçiminde gelir. Bu modüllerin yüklenmesi için diske erişim gerekir ve maliyet eklenebilir. Bu, soğuk başlatma üzerinde en büyük etkiye sahiptir, ancak sıcak başlatmayı da etkileyebilir. .NET uygulamalarında CLR, derlemeleri isteğe bağlı olarak yükleyerek bu maliyeti mümkün olduğunca geciktirmeye çalışır. Başka bir ifadeyle, yürütülen bir yöntem buna başvurana kadar CLR bir modülü yüklemez. Bu nedenle, CLR'nin gereksiz modülleri yüklememesi için yalnızca uygulamanızın başlangıç kodunda başlatılması için gereken derlemelere başvurun. Başlangıç yolunuzda gereksiz başvurulara sahip kullanılmayan kod yollarınız varsa, gereksiz yüklemeleri önlemek için bu kod yollarını diğer yöntemlere taşıyın.

Modül yüklemelerini azaltmanın bir diğer yolu da uygulama modüllerini birleştirmektir. Bir büyük derlemenin yüklenmesi genellikle iki küçük derlemenin yüklenmesinden daha az zaman alır. Bu her zaman mümkün değildir ve modülleri yalnızca geliştirici üretkenliği veya kod yeniden kullanılabilirliği açısından önemli bir fark yaratmıyorsa birleştirmeniz gerekir. Başlangıçta hangi modüllerin yüklendiğini öğrenmek için PerfView veya Windows Performance Analyzer (WPA) gibi araçları kullanabilirsiniz.

Akıllı web isteklerinde bulunma

XAML, görüntüler ve uygulama için önemli olan diğer dosyalar dahil olmak üzere içeriğini yerel olarak paketleyerek uygulamanın yükleme süresini önemli ölçüde geliştirebilirsiniz. Disk işlemleri ağ işlemlerinden daha hızlıdır. Bir uygulamanın başlatma sırasında belirli bir dosyaya ihtiyacı varsa, bir uzak sunucudan almak yerine diskten yükleyerek genel başlatma süresini azaltabilirsiniz.

Günlük ve önbellek sayfalarını verimli bir şekilde yönetme

Gezinti özellikleri sağlayan Frame denetimi. Bir sayfaya (Navigate yöntem), gezinti günlüğü kaydına (BackStack ve ForwardStack özelliklerine GoForward ve GoBack yöntemlerine), sayfa önbelleğe alma (Page.NavigationCacheMode) ve serileştirme desteğine (GetNavigationState yöntem) gezinti olanağı sunar.

Frame ile ilgili dikkat edilmesi gereken performans öncelikli olarak günlüğe kaydetme ve sayfa önbelleğe alma üzerinde yoğunlaşmaktadır.

Çerçeve günlük kaydı. Frame.Navigate bir sayfaya gittiğinizde, geçerli sayfa için bir PageStackEntry, Frame.BackStack koleksiyonuna eklenir. PageStackEntry görece küçüktür, ancak koleksiyonun boyutuyla BackStack ilgili yerleşik bir sınır yoktur. Potansiyel olarak, bir kullanıcı döngüde gezinebilir ve bu koleksiyonu süresiz olarak büyütebilir.

PageStackEntry, Frame.Navigate yöntemine geçirilen parametreyi de içerir. Bu parametrenin int veya string gibi ilkel serileştirilebilir bir tür olması, Frame.GetNavigationState yönteminin çalışmasını sağlamak için önerilir. Ancak bu parametre, daha fazla çalışma kümesi veya diğer kaynakların önemli miktarlarını hesaplayan bir nesneye başvurabilir, böylece BackStack içindeki her girişi çok daha pahalı hale getirebilir. Örneğin, StorageFile'yi bir parametre olarak kullanabilirsiniz ve bu nedenle BackStack belirsiz sayıda dosyayı açık tutabilir.

Bu nedenle gezinti parametrelerinin küçük tutulması ve boyutunun BackStacksınırlandırılması önerilir. BackStack, C# dilindeki standart bir koleksiyondur, bu nedenle yalnızca girdiler kaldırılarak kırpılabilir.

Sayfa önbelleğe alma. Varsayılan olarak, yöntemiyle Frame.Navigate bir sayfaya gittiğinizde, sayfanın yeni bir örneği oluşturulur. Aynı şekilde, Frame.GoBack ile önceki sayfaya geri dönerseniz, önceki sayfanın yeni bir örneği tahsis edilir.

Frame ayrıca bu örneklemeleri önleyebilecek isteğe bağlı bir sayfa önbelleği sunar. Bir sayfanın önbelleğe alınması için Page.NavigationCacheMode özelliğini kullanın. Modu Required olarak ayarlamak sayfanın önbelleğe alınmasını zorunlu hale getirirken, Enabled olarak ayarlamak önbelleğe alınmasına izin verir. Varsayılan olarak, önbellek boyutu 10 sayfadır, ancak bu özellik ile Frame.CacheSize geçersiz kılınabilir. Tüm Required sayfalar önbelleğe alınır ve gerekli sayfalardan daha az, CacheSize sayfa varsa, Enabled sayfalar da önbelleğe alınabilir.

Sayfa önbelleğe alma, örneklemelerden kaçınarak ve bu nedenle gezinti performansını iyileştirerek performansa yardımcı olabilir. Sayfa önbelleğe alma, aşırı önbelleğe alma nedeniyle çalışma kümesine zarar vererek performansı olumsuz etkileyebilir.

Bu nedenle, sayfa önbelleğini uygulamanız için uygun şekilde kullanmanız önerilir. Örneğin, içindeki öğelerin listesini gösteren bir Frameuygulamanız olduğunu ve bir öğeyi seçtiğinizde çerçevede ilgili öğenin ayrıntı sayfasına gittiği varsayalım. Liste sayfası büyük olasılıkla önbellek olarak ayarlanmalıdır. Ayrıntı sayfası tüm öğeler için aynıysa, büyük olasılıkla bu sayfa da önbelleğe alınmalıdır. Ancak ayrıntı sayfası daha heterojense, önbelleğe almayı devre dışı bırakmak daha iyi olabilir.