Bagikan melalui


Virtualisasi data ListView dan GridView

Catatan Untuk detail selengkapnya, lihat sesi //build/ Meningkatkan Performa Secara Dramatis saat Pengguna Berinteraksi dengan Data Dalam Jumlah Besar di GridView dan ListView.

Tingkatkan performa ListView dan GridView dan waktu mulai melalui virtualisasi data. Untuk virtualisasi UI, pengurangan elemen, dan pembaruan item secara progresif, lihat Pengoptimalan UI ListView dan GridView.

Metode virtualisasi data diperlukan untuk himpunan data yang sangat besar sehingga tidak dapat atau tidak semuanya disimpan dalam memori pada satu waktu. Anda memuat bagian awal ke dalam memori (dari disk lokal, jaringan, atau cloud) dan menerapkan virtualisasi UI ke himpunan data parsial ini. Anda nantinya dapat memuat data secara bertahap, atau dari titik arbitrer dalam himpunan data master (akses acak), sesuai permintaan. Apakah virtualisasi data sesuai untuk Anda bergantung pada banyak faktor.

  • Ukuran himpunan data Anda
  • Ukuran setiap item
  • Sumber himpunan data (disk lokal, jaringan, atau cloud)
  • Konsumsi memori keseluruhan aplikasi Anda

Perhatikan bahwa fitur diaktifkan secara default untuk ListView dan GridView yang menampilkan visual tempat penampung sementara saat pengguna melakukan panning/scrolling dengan cepat. Saat data dimuat, visual tempat penampung ini diganti dengan templat item Anda. Anda dapat menonaktifkan fitur dengan mengatur ListViewBase.ShowsScrollingPlaceholders ke false, tetapi jika Anda melakukannya, kami sarankan Anda menggunakan atribut x:Phase untuk merender elemen secara progresif dalam templat item Anda. Lihat Memperbarui item ListView dan GridView secara progresif.

Berikut adalah detail selengkapnya tentang teknik virtualisasi data akses inkremental dan acak.

Virtualisasi data inkremental

Virtualisasi data bertahap memuat data secara berurutan. ListView yang menggunakan virtualisasi data inkremental dapat digunakan untuk melihat kumpulan jutaan item, tetapi hanya 50 item yang dimuat pada awalnya. Saat pengguna menggeser/menggulir, 50 berikutnya dimuat. Saat item dimuat, ibu jari bilah gulir berkurang ukurannya. Untuk jenis virtualisasi data ini, Anda menulis kelas sumber data yang mengimplementasikan antarmuka ini.

Sumber data seperti ini adalah daftar dalam memori yang dapat terus diperluas. Kontrol item akan meminta item menggunakan pengindeks IList standar dan properti hitung. Jumlah harus mewakili jumlah item secara lokal, bukan ukuran himpunan data yang sebenarnya.

Ketika kontrol item mendekati akhir data yang ada, kontrol item akan memanggil ISupportIncrementalLoading.HasMoreItems. Jika Anda mengembalikan true, maka akan memanggil ISupportIncrementalLoading.LoadMoreItemsAsync melewati jumlah item yang disarankan untuk dimuat. Bergantung pada tempat Anda memuat data dari (disk lokal, jaringan, atau cloud), Anda dapat memilih untuk memuat jumlah item yang berbeda dari yang disarankan. Misalnya, jika layanan Anda mendukung batch 50 item tetapi kontrol item hanya meminta 10 maka Anda dapat memuat 50. Muat data dari back end Anda, tambahkan ke daftar Anda, dan ajukan pemberitahuan perubahan melalui INotifyCollectionChanged atau IObservableVector<T> sehingga kontrol item tahu tentang item baru. Juga mengembalikan hitungan item yang benar-benar Anda muat. Jika Anda memuat lebih sedikit item daripada yang disarankan, atau kontrol item telah di-panned/digulir lebih jauh di sementara, sumber data Anda akan dipanggil lagi untuk lebih banyak item dan siklus akan berlanjut. Anda dapat mempelajari lebih lanjut dengan mengunduh sampel pengikatan data XAML untuk Windows 8.1 dan menggunakan kembali kode sumbernya di aplikasi Windows 10 Anda.

Virtualisasi data akses acak

Virtualisasi data akses acak memungkinkan pemuatan dari titik sewenang-wenang dalam himpunan data. ListView yang menggunakan virtualisasi data akses acak, yang digunakan untuk melihat kumpulan jutaan item, dapat memuat item 100.000 – 100.050. Jika pengguna kemudian berpindah ke awal daftar, kontrol akan memuat item 1 – 50. Setiap saat, jempol bilah gulir menunjukkan bahwa ListView berisi satu juta item. Posisi jempol bilah gulir relatif terhadap tempat item yang terlihat berada di seluruh himpunan data koleksi. Jenis virtualisasi data ini dapat secara signifikan mengurangi persyaratan memori dan waktu muat untuk pengumpulan. Untuk mengaktifkannya, Anda perlu menulis kelas sumber data yang mengambil data sesuai permintaan dan mengelola cache lokal dan mengimplementasikan antarmuka ini.

IItemsRangeInfo menyediakan informasi tentang item mana yang digunakan kontrol secara aktif. Kontrol item akan memanggil metode ini setiap kali tampilannya berubah, dan akan menyertakan dua set rentang ini.

  • Kumpulan item yang ada di viewport.
  • Sekumpulan item yang tidak divirtualisasikan yang digunakan kontrol yang mungkin tidak ada di viewport.
    • Buffer item di sekitar viewport yang dikontrol item sehingga panning sentuhan halus.
    • Item yang difokuskan.
    • Item pertama.

Dengan menerapkan IItemsRangeInfo , sumber data Anda tahu item apa yang perlu diambil dan di-cache, dan kapan harus memangkas dari data cache yang tidak lagi diperlukan. IItemsRangeInfo menggunakan objek ItemIndexRange untuk menjelaskan sekumpulan item berdasarkan indeksnya dalam koleksi. Ini agar tidak menggunakan penunjuk item, yang mungkin tidak benar atau stabil. IItemsRangeInfo dirancang untuk digunakan hanya oleh satu instans kontrol item karena bergantung pada informasi status untuk kontrol item tersebut. Jika beberapa kontrol item memerlukan akses ke data yang sama, Anda akan memerlukan instans terpisah dari sumber data untuk masing-masing item. Mereka dapat berbagi cache umum, tetapi logika untuk menghapus menyeluruh dari cache akan lebih rumit.

Berikut adalah strategi dasar untuk sumber data virtualisasi data akses acak Anda.

  • Saat dimintai item
    • Jika Anda memilikinya tersedia dalam memori, maka kembalikan.
    • Jika Anda tidak memilikinya, maka kembalikan item null atau tempat penampung.
    • Gunakan permintaan untuk item (atau informasi rentang dari IItemsRangeInfo) untuk mengetahui item mana yang diperlukan, dan untuk mengambil data untuk item dari back end Anda secara asinkron. Setelah mengambil data, ajukan pemberitahuan perubahan melalui INotifyCollectionChanged atau IObservableVector<T> sehingga kontrol item tahu tentang item baru.
  • (Opsional) saat viewport kontrol item berubah, identifikasi item apa yang diperlukan dari sumber data Anda melalui implementasi IItemsRangeInfo Anda.

Di luar itu, strategi kapan harus memuat item data, berapa banyak yang harus dimuat, dan item mana yang harus disimpan dalam memori hingga aplikasi Anda. Beberapa pertimbangan umum yang perlu diingat:

  • Membuat permintaan asinkron untuk data; jangan blokir utas UI.
  • Temukan tempat manis dalam ukuran batch tempat Anda mengambil item. Lebih suka potongan untuk cerewet. Tidak terlalu kecil sehingga Anda membuat terlalu banyak permintaan kecil; tidak terlalu besar sehingga mereka membutuhkan waktu terlalu lama untuk diambil.
  • Pertimbangkan berapa banyak permintaan yang ingin Anda tertunda secara bersamaan. Melakukan satu per satu lebih mudah, tetapi mungkin terlalu lambat jika waktu penyelesaian tinggi.
  • Dapatkah Anda membatalkan permintaan data?
  • Jika menggunakan layanan yang dihosting, apakah ada biaya per transaksi?
  • Jenis pemberitahuan apa yang disediakan oleh layanan saat hasil kueri diubah? Akankah Anda tahu apakah item disisipkan pada indeks 33? Jika layanan Anda mendukung kueri berdasarkan kunci-plus-offset, itu mungkin lebih baik daripada hanya menggunakan indeks.
  • Seberapa pintar Anda ingin berada dalam item pra-pengambilan? Apakah Anda akan mencoba dan melacak arah dan kecepatan gulir untuk memprediksi item mana yang diperlukan?
  • Seberapa agresif Anda ingin membersihkan cache? Ini adalah tradeoff memori versus pengalaman.