Aracılığıyla paylaş


ListView ve GridView veri sanallaştırması

Not
Daha fazla ayrıntı için "GridView ve ListView'da Kullanıcılar Büyük Miktarlarda Veriyle Etkileşime Geçtiğinde Performansı Önemli Ölçüde Artırma" oturumunu //build/ sitesinde inceleyebilirsiniz.

Veri sanallaştırma aracılığıyla ListView ve GridView performansını ve başlangıç süresini geliştirin. Kullanıcı arabirimi sanallaştırma, öğe azaltma ve öğelerin aşamalı güncelleştirmesi için bkz. WinUI için ListView ve GridView performansını iyileştirme.

Bellekte tamamı aynı anda depolanamayacak kadar büyük bir veri kümesi için veri sanallaştırma yöntemi gereklidir. Belleğe bir ilk bölüm yüklersiniz (yerel diskten, ağdan veya buluttan) ve bu kısmi veri kümesine kullanıcı arabirimi sanallaştırması uygularsınız. Daha sonra verileri isteğe bağlı olarak artımlı olarak veya ana veri kümesindeki rastgele noktalardan (rastgele erişim) yükleyebilirsiniz. Veri sanallaştırmanın sizin için uygun olup olmadığı birçok faktöre bağlıdır.

  • Veri kümenizin boyutu
  • Her öğenin boyutu
  • Veri kümesinin kaynağı (yerel disk, ağ veya bulut)
  • WinUI uygulamanızın genel bellek tüketimi

Not ListView ve GridView tarafından varsayılan olarak etkinleştirilen ve kullanıcının hızlıca kaydırma veya panoramaya geçmesi durumunda geçici yer tutucu görsellerini görüntüleyen bir özelliğin olduğunu unutmayın. Veriler yüklendikçe, bu yer tutucu görseller öğe şablonunuzla değiştirilir. ListViewBase.ShowsScrollingPlaceholders değerini false olarak ayarlayarak özelliği kapatabilirsiniz, ancak bunu yaparsanız öğe şablonunuzdaki öğeleri aşamalı olarak işlemek için x:Phase özniteliğini kullanmanızı öneririz. Bkz. ListView ve GridView öğelerini aşamalı olarak güncelleştirme.

Artımlı ve rastgele erişimli veri sanallaştırma teknikleri hakkında daha fazla ayrıntı aşağıdadır.

Artımlı veri sanallaştırma

Artımlı veri sanallaştırma verileri sırayla yükler. Artımlı veri sanallaştırma kullanan bir ListView , bir milyon öğeden oluşan bir koleksiyonu görüntülemek için kullanılabilir, ancak başlangıçta yalnızca 50 öğe yüklenir. Kullanıcı sayfayı kaydırdığında veya kaydırdığında sonraki 50 öğe yüklenir. Öğeler yüklendikçe kaydırma çubuğunun başparmak boyutu azalır. Bu tür bir veri sanallaştırma için bu arabirimleri uygulayan bir veri kaynağı sınıfı yazarsınız.

Bunun gibi bir veri kaynağı, sürekli olarak genişletilebilen bellek içi bir listedir. Öğeler denetimi, standart IList dizin oluşturucu ve sayı özelliklerini kullanan öğeleri ister. Sayı, veri kümesinin gerçek boyutunu değil yerel olarak öğe sayısını temsil etmelidir.

Öğeler denetimi mevcut verilerin sonuna yaklaştığında , ISupportIncrementalLoading.HasMoreItems'i çağırır. True değerini döndürürseniz ISupportIncrementalLoading.LoadMoreItemsAsync çağrısı yaparak yüklenecek önerilen öğe sayısını geçirir. Verileri (yerel disk, ağ veya bulut) nereden yüklediğinize bağlı olarak, önerilenden farklı sayıda öğe yüklemeyi seçebilirsiniz. Örneğin, hizmetiniz 50 öğeden oluşan toplu işleri destekliyorsa ancak öğe denetimi yalnızca 10 öğe istiyorsa, 50'yi yükleyebilirsiniz. Arka ucunuzdaki verileri yükleyin, listenize ekleyin ve öğe denetiminin yeni öğeler hakkında bilgi edinmesi için INotifyCollectionChanged veya IObservableVector<T> aracılığıyla bir değişiklik bildirimi sağlayın. Ayrıca, gerçekten yüklediğiniz öğelerin sayısını döndürür. Önerilenden daha az öğe yüklerseniz veya öğeler denetimi arada daha da kaydırılırsa, veri kaynağınız daha fazla öğe için yeniden çağrılır ve döngü devam eder. ISupportIncrementalLoading , Bir WinUI uygulamasında aynı artımlı yükleme desenini kullanabilmeniz için Windows Uygulama SDK'sında kullanılabilir durumda kalır.

Rastgele erişim verileri sanallaştırma

Rastgele erişim veri sanallaştırması, veri kümesindeki rastgele bir noktadan yüklemeye izin verir. Bir milyon öğeden oluşan bir koleksiyonu görüntülemek için rastgele erişim veri sanallaştırması kullanan bir ListView , 100.000-100.050 arası öğeleri yükleyebilir. Kullanıcı listenin başına geçerse, denetim 1-50 arası öğeleri yükler. Kaydırma çubuğunun başparmağı her zaman ListView'un bir milyon öğe içerdiğini gösterir. Kaydırma çubuğunun başparmağının konumu, görünür öğelerin koleksiyonun tüm veri kümesinde bulunduğu yere göredir. Bu veri sanallaştırma türü, koleksiyon için bellek gereksinimlerini ve yükleme sürelerini önemli ölçüde azaltabilir. Bunu etkinleştirmek için isteğe bağlı verileri getiren, yerel önbelleği yöneten ve bu arabirimleri uygulayan bir veri kaynağı sınıfı yazmanız gerekir.

IItemsRangeInfo , denetimin etkin olarak hangi öğeleri kullandığı hakkında bilgi sağlar. Öğe denetimi görünümü her değiştiğinde bu yöntemi çağırır ve bu iki aralık kümesini içerir.

  • Görünüm bölmesindeki öğe kümesi.
  • Denetimin kullandığı, görünüm penceresi içinde olmayan sanallaştırılmamış öğeler kümesi.
    • Öğe denetiminin dokunmatik kaydırmanın düzgün olması için görünüm penceresi çevresindeki öğelerin arabelleği.
    • Odaklanmış öğe.
    • İlk öğe.

IItemsRangeInfo uygulayarak, veri kaynağınız hangi öğelerin alınması ve önbelleğe alınması gerektiğini ve artık gerekli olmayan verilerin önbellekten ne zaman çıkarılacağı konusunda bilgi sahibi olur. IItemsRangeInfo , öğe kümesini koleksiyondaki dizinlerine göre açıklamak için ItemIndexRange nesnelerini kullanır. Bu, doğru veya kararlı olmayan öğe işaretçilerini önler. IItemsRangeInfo , bir öğe denetiminin yalnızca tek bir örneği tarafından kullanılacak şekilde tasarlanmıştır çünkü bu öğe denetimi için durum bilgilerine dayanır. Birden çok öğe denetiminin aynı verilere erişmesi gerekiyorsa, her biri için ayrı bir veri kaynağı örneğine ihtiyacınız vardır. Ortak bir önbelleği paylaşabilirler, ancak önbellekten temizleme mantığı daha karmaşık olacaktır. IItemsRangeInfo , Windows Uygulama SDK'sında kullanılabilir durumda kalır, bu nedenle aynı rastgele erişim önbelleğe alma teknikleri WinUI denetimleri için de geçerlidir.

Rastgele erişimli veri sanallaştırma veri kaynağınız için temel strateji aşağıdadır.

  • Bir öğe istendiğinde
    • Bellekte kullanılabilir durumdaysa döndürebilirsiniz.
    • Eğer öğeye sahip değilseniz, ya null ya da bir yer tutucu öğe döndürün.
    • Hangi öğelerin gerekli olduğunu öğrenmek ve arka ucunuzdaki öğelere ait verileri zaman uyumsuz olarak getirmek için bir öğeye (veya IItemsRangeInfo'dan gelen aralık bilgilerine) yönelik isteği kullanın. Verileri aldıktan sonra, öğe denetiminin yeni öğeyi bilmesi için INotifyCollectionChanged veya IObservableVector<T> aracılığıyla bir değişiklik bildirimi alın.
  • (İsteğe bağlı olarak), öğe denetiminin görünüm penceresi değiştikçe , IItemsRangeInfo uygulamanız aracılığıyla veri kaynağınızdan hangi öğelerin gerekli olduğunu belirleyin.

Bunun ötesinde, veri öğelerinin ne zaman yüklendiğine, kaç öğenin yüklendiğine ve bellekte hangi öğelerin tutulacaklarına yönelik strateji uygulamanız için geçerlidir. Göz önünde bulundurulması gereken bazı genel noktalar:

  • Veriler için zaman uyumsuz istekler yapın; kullanıcı arabirimi iş parçacığını engellemeyin.
  • Getirdiğiniz öğelerin parti boyutunda dengeli noktayı bulun. Öbekliyi gevelemeye tercih edin. Çok fazla küçük istekte bulunacağınız kadar küçük değil; alınmaları çok uzun sürecek kadar büyük değil.
  • Aynı anda kaç isteğin beklemede olmasını istediğinizi göz önünde bulundurun. Bir şeyi teker teker yapmak daha kolaydır, ancak geri dönüş süresi yüksekse bu çok yavaş olabilir.
  • Veri isteklerini iptal edebilir misiniz?
  • Barındırılan bir hizmet kullanıyorsanız işlem başına maliyet var mı?
  • Bir sorgunun sonuçları değiştiğinde hizmet tarafından ne tür bildirimler sağlanır? Dizin 33'e bir öğe eklenip eklenmediğini biliyor musunuz? Hizmetiniz anahtar artı uzaklığı temelinde sorguları destekliyorsa, bu yalnızca bir dizin kullanmaktan daha iyi olabilir.
  • Öğeleri önceden hazırlama konusunda ne kadar akıllı olmak istiyorsunuz? Hangi öğelerin gerekli olduğunu tahmin etmek için kaydırma yönünü ve hızını izlemeye mi çalışacaksınız?
  • Önbelleği temizlerken ne kadar agresif olmak istiyorsunuz? Bu, bellek ve deneyim arasında bir dengedir.