Panel yang Anda sebutkan adalah panel Tata Letak sehingga gambaran umum singkat dari sistem tata letak menunjukkan bahwa itu kemungkinan tidak akan menjadi daftar sederhana dari panel yang paling efisien tetapi bagaimana Anda menggunakan panel yang memiliki efek terbesar pada efisiensi dan kinerja.
LayoutSystem_Overview :
Paling sederhana, tata letak adalah sistem rekursif yang mengarah ke elemen yang diukur, diposisikan, dan digambar. Lebih khusus lagi, tata letak menjelaskan proses mengukur dan mengatur anggota koleksi Anak-anak elemen Panel. Layout adalah proses yang intensif. Semakin besar koleksi Children, semakin besar jumlah perhitungan yang harus dilakukan. Kompleksitas juga dapat diperkenalkan berdasarkan perilaku tata letak yang ditentukan oleh elemen Panel yang memiliki koleksi. Panel yang relatif sederhana, seperti Canvas, dapat memiliki kinerja yang jauh lebih baik daripada Panel yang lebih kompleks, seperti Grid.
Setiap kali UIElement anak mengubah posisinya, ia berpotensi memicu lintasan baru oleh sistem tata letak. Oleh karena itu, penting untuk memahami peristiwa yang dapat memicu sistem tata letak, karena pemanggilan yang tidak perlu dapat menyebabkan kinerja aplikasi yang buruk. Berikut ini menjelaskan proses yang terjadi ketika sistem tata letak dipanggil.
1. UIElement anak memulai proses tata letak dengan terlebih dahulu mengukur properti intinya.
2. Properti ukuran yang didefinisikan pada FrameworkElement dievaluasi, seperti Lebar, Tinggi, dan Margin.
3. Logika khusus panel diterapkan, seperti arah Dock atau Orientasi susun.
4. Konten diatur setelah semua anak diukur.
5. Koleksi Children digambar di layar.
6. Proses dipanggil lagi jika Anak tambahan ditambahkan ke koleksi, LayoutTransform diterapkan, atau metode UpdateLayout dipanggil.
Lihat LayoutSystem_Measure_Arrange untuk informasi lebih lanjut tentang pengukuran dan pengaturan anak-anak
LayoutSystem_Performance :
Layout adalah proses rekursif. Setiap elemen anak dalam koleksi Children akan diproses selama setiap pemanggilan sistem tata letak. Akibatnya, memicu sistem tata letak harus dihindari ketika tidak perlu. Pertimbangan berikut dapat membantu Anda mencapai kinerja yang lebih baik.
Waspadai perubahan nilai properti mana yang akan memaksa pembaruan rekursif oleh sistem tata letak.
Properti ketergantungan yang nilainya dapat menyebabkan sistem tata letak diinisialisasi ditandai dengan bendera publik. AffectsMeasure dan AffectsArrange memberikan petunjuk yang berguna tentang perubahan nilai properti yang akan memaksa pembaruan rekursif oleh sistem tata letak. Secara umum, properti apa pun yang dapat memengaruhi ukuran kotak pembatas elemen harus memiliki flag AffectsMeasure yang disetel ke true. Untuk informasi lebih lanjut, lihat Ikhtisar Properti Ketergantungan.
Jika memungkinkan, gunakan RenderTransform alih-alih LayoutTransform.
LayoutTransform dapat menjadi cara yang sangat berguna untuk memengaruhi konten antarmuka pengguna (UI). Namun, jika efek transformasi tidak harus berdampak pada posisi elemen lain, yang terbaik adalah menggunakan RenderTransform sebagai gantinya, karena RenderTransform tidak menggunakan sistem tata letak. LayoutTransform menerapkan transformasi dan memaksa pembaruan tata letak rekursif untuk memperhitungkan posisi baru elemen yang terpengaruh.
Hindari panggilan yang tidak perlu ke UpdateLayout.
Metode UpdateLayout memaksa pembaruan tata letak rekursif, dan seringkali tidak diperlukan. Kecuali Anda yakin bahwa pembaruan penuh diperlukan, bergantung pada sistem tata letak untuk memanggil metode ini untuk Anda.
Saat bekerja dengan koleksi Anak besar, pertimbangkan untuk menggunakan VirtualizingStackPanel, bukan StackPanel biasa.
Dengan memvirtualisasi koleksi anak, VirtualizingStackPanel hanya menyimpan objek dalam memori yang saat ini berada dalam ViewPort induk. Akibatnya, kinerja meningkat secara substansial di sebagian besar skenario.
Mengoptimalkan Kinerja: Tata Letak dan Desain : Artikel ini menjelaskan secara rinci tentang cara membangun pohon secara efisien dan memberikan daftar panel sederhana berdasarkan kerumitannya
Kanvas (paling tidak rumit = kinerja lebih efisien dan lebih baik)
Kisi
Panel Lainnya (lebih kompleks = kurang efisien dan kinerja lebih buruk)
Pertimbangan kinerja lain yang perlu diperhatikan: Cara untuk meningkatkan kecepatan rendering UI WPF
- Cache semuanya. Kuas, Warna, Geometri, Teks Berformat, Mesin Terbang. (Misalnya kita memiliki dua kelas: RenderTools dan TextCache. Proses rendering dari masing-masing unit alamat ke instance bersama dari kedua kelas. Jadi jika dua bagan memiliki teks yang sama, persiapannya dieksekusi sekali saja.)
- Freeze Freezable, jika Anda berencana untuk menggunakannya untuk waktu yang lama. Terutama geometri. Geometri unfreezed yang kompleks mengeksekusi HitTest dengan sangat lambat.
- Pilih cara tercepat membuat setiap primitif. Misalnya, ada sekitar 6 cara rendering teks, tetapi yang tercepat adalah DrawingContext.DrawGlyphs.
- Aktifkan Daur Ulang Kontainer. Virtualisasi membawa banyak peningkatan kinerja, tetapi wadah akan dibuang dan dibuat ulang, ini adalah default. Tetapi Anda dapat memperoleh lebih banyak kinerja dengan mendaur ulang wadah dengan mengatur VirtualizingStackPanel.VirtualizationMode = "Daur Ulang"
- Dari sini : Tidak ada batasan praktis untuk jumlah sarang yang dapat didukung aplikasi Anda, namun, umumnya yang terbaik adalah membatasi aplikasi Anda hanya menggunakan panel-panel yang sebenarnya diperlukan untuk tata letak yang Anda inginkan. Dalam banyak kasus, elemen Grid dapat digunakan sebagai pengganti panel bersarang karena fleksibilitasnya sebagai wadah tata letak. Ini dapat meningkatkan kinerja dalam aplikasi Anda dengan menjaga elemen yang tidak perlu keluar dari pohon.