Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Memahami perilaku intrinsik objek WPF akan membantu Anda melakukan tradeoff yang tepat antara fungsionalitas dan performa.
Tidak Menghapus Pengendali Acara pada Objek dapat Menjaga Objek Terus Ada
Delegasi yang diteruskan objek ke peristiwanya secara efektif merupakan referensi ke objek tersebut. Oleh karena itu, penanganan peristiwa dapat membuat objek bertahan lebih lama dari yang diharapkan. Saat melakukan pembersihan objek yang telah terdaftar untuk mendengarkan event suatu objek, penting untuk menghapus delegasi tersebut sebelum merilis objek. Menjaga objek yang tidak dibutuhkan tetap hidup meningkatkan penggunaan memori aplikasi. Ini terutama berlaku ketika objek adalah akar pohon logis atau pohon visual.
WPF memperkenalkan pola pendengar peristiwa yang lemah untuk peristiwa yang dapat berguna dalam situasi di mana hubungan seumur hidup objek antara sumber dan pendengar sulit dilacak. Beberapa peristiwa WPF yang ada menggunakan pola ini. Jika Anda menerapkan objek dengan peristiwa kustom, pola ini mungkin digunakan untuk Anda. Untuk detailnya, lihat Pola Peristiwa Lemah.
Ada beberapa alat, seperti CLR Profiler dan Penampil Set Kerja, yang dapat memberikan informasi tentang penggunaan memori proses yang ditentukan. CLR Profiler mencakup sejumlah tampilan profil alokasi yang sangat berguna, termasuk histogram jenis yang dialokasikan, grafik alokasi dan panggilan, garis waktu yang menunjukkan pengumpulan sampah dari berbagai generasi dan status timbunan terkelola yang dihasilkan setelah koleksi tersebut, dan pohon panggilan yang menunjukkan alokasi per metode dan beban perakitan. Untuk informasi selengkapnya, lihat Performa.
Properti dan Objek Dependensi
Secara umum, mengakses properti dependensi dari DependencyObject tidak lebih lambat daripada mengakses properti CLR. Meskipun ada beban tambahan kecil dalam menetapkan nilai properti, mendapatkan nilainya secepat mendapatkan nilai dari properti CLR. Mengimbangi sedikit penurunan performa adalah fakta bahwa properti ketergantungan mendukung fitur yang tangguh, seperti pengikatan data, animasi, pewarisan, dan penataan. Untuk informasi selengkapnya, lihat Gambaran Umum Properti Dependensi .
Pengoptimalan DependencyProperty
Anda harus menentukan properti dependensi dalam aplikasi Anda dengan sangat hati-hati. Jika Anda DependencyProperty hanya memengaruhi opsi metadata jenis render, bukan opsi metadata lainnya seperti AffectsMeasure, Anda harus menandainya demikian dengan mengganti metadatanya. Untuk informasi selengkapnya tentang mengambil alih atau mendapatkan metadata properti, lihat metadata Properti Dependensi .
Mungkin lebih efisien untuk memiliki handler perubahan properti yang secara manual mengabaikan pengukuran, penataan, dan rendering jika tidak semua perubahan properti benar-benar berdampak pada pengukuran, penataan, dan rendering. Misalnya, Anda dapat memutuskan untuk merender kembali latar belakang hanya ketika nilai lebih besar dari batas yang ditetapkan. Dalam hal ini, handler perubahan properti Anda hanya akan membatalkan render ketika nilai melebihi batas yang ditetapkan.
Membuat DependencyProperty yang dapat diwarisi bukan tanpa biaya
Secara default, properti dependensi terdaftar tidak dapat diwariskan. Namun, Anda dapat secara eksplisit membuat properti apa pun dapat diwariskan. Meskipun ini adalah fitur yang berguna, mengonversi properti menjadi dapat diwariskan berdampak pada performa dengan meningkatkan lamanya waktu untuk pembatalan properti.
Gunakan RegisterClassHandler Dengan Hati-hati
Saat memanggil RegisterClassHandler memungkinkan Anda menyimpan status instans, penting untuk mengetahui bahwa handler dipanggil pada setiap instans, yang dapat menyebabkan masalah performa. Hanya gunakan RegisterClassHandler saat aplikasi Anda mengharuskan Anda menyimpan status instans Anda.
Atur Nilai Default untuk DependencyProperty saat Pendaftaran
Saat membuat DependencyProperty yang memerlukan nilai default, atur nilai menggunakan metadata default yang diteruskan sebagai parameter ke Register metode DependencyProperty. Sebaiknya gunakan teknik ini daripada mengatur nilai properti dalam konstruktor atau pada setiap instans elemen.
Tetapkan Nilai PropertyMetadata menggunakan Register
Saat membuat DependencyProperty, Anda memiliki opsi untuk mengatur PropertyMetadata menggunakan metode Register atau OverrideMetadata. Meskipun objek Anda dapat memiliki konstruktor statis untuk memanggil OverrideMetadata, ini bukan solusi optimal dan akan berdampak pada performa. Untuk performa terbaik, atur PropertyMetadata selama panggilan ke Register.
Objek Dapat Dibekukan
Freezable adalah jenis objek khusus yang memiliki dua status: tidak beku dan beku. Membekukan objek jika memungkinkan meningkatkan performa aplikasi Anda dan mengurangi set kerjanya. Untuk informasi selengkapnya, lihat Gambaran Umum Objek Freezable.
Masing-masing Freezable memiliki Changed event yang dipicu setiap kali terjadi perubahan. Namun, pemberitahuan perubahan mahal dalam hal performa aplikasi.
Pertimbangkan contoh berikut di mana masing-masing Rectangle menggunakan objek yang sama Brush :
rectangle_1.Fill = myBrush;
rectangle_2.Fill = myBrush;
rectangle_3.Fill = myBrush;
// ...
rectangle_10.Fill = myBrush;
rectangle_1.Fill = myBrush
rectangle_2.Fill = myBrush
rectangle_3.Fill = myBrush
' ...
rectangle_10.Fill = myBrush
Secara default, WPF menyediakan penanganan aktivitas untuk SolidColorBrush peristiwa objek Changed untuk membatalkan validasi Rectangle properti objek Fill . Dalam hal ini, setiap kali SolidColorBrush harus menyalakan peristiwanya Changed , diperlukan untuk memanggil fungsi panggilan balik untuk masing-masing Rectangle—akumulasi pemanggilan fungsi panggilan balik ini memberlakukan hukuman performa yang signifikan. Selain itu, penambahan dan penghapusan handler pada titik ini sangat membutuhkan banyak sumber daya karena aplikasi harus menelusuri seluruh daftar untuk melakukannya. Jika skenario aplikasi Anda tidak pernah mengubah SolidColorBrush, Anda akan membayar biaya untuk mempertahankan Changed penanganan aktivitas secara tidak perlu.
Membekukan Freezable dapat meningkatkan performanya, karena tidak perlu lagi mengeluarkan sumber daya untuk mempertahankan pemberitahuan perubahan. Tabel di bawah ini menunjukkan perbandingan ukuran dari sebuah SolidColorBrush sederhana ketika propertinya IsFrozen diatur ke true dibandingkan dengan ketika properti tersebut tidak diatur. Ini mengasumsikan menerapkan satu kuas ke Fill properti sepuluh Rectangle objek.
| Status | Ukuran |
|---|---|
| Beku SolidColorBrush | 212 Byte |
| Tidak beku SolidColorBrush | 972 Byte |
Sampel kode berikut menunjukkan konsep ini:
Brush frozenBrush = new SolidColorBrush(Colors.Blue);
frozenBrush.Freeze();
Brush nonFrozenBrush = new SolidColorBrush(Colors.Blue);
for (int i = 0; i < 10; i++)
{
// Create a Rectangle using a non-frozed Brush.
Rectangle rectangleNonFrozen = new Rectangle();
rectangleNonFrozen.Fill = nonFrozenBrush;
// Create a Rectangle using a frozed Brush.
Rectangle rectangleFrozen = new Rectangle();
rectangleFrozen.Fill = frozenBrush;
}
Dim frozenBrush As Brush = New SolidColorBrush(Colors.Blue)
frozenBrush.Freeze()
Dim nonFrozenBrush As Brush = New SolidColorBrush(Colors.Blue)
For i As Integer = 0 To 9
' Create a Rectangle using a non-frozed Brush.
Dim rectangleNonFrozen As New Rectangle()
rectangleNonFrozen.Fill = nonFrozenBrush
' Create a Rectangle using a frozed Brush.
Dim rectangleFrozen As New Rectangle()
rectangleFrozen.Fill = frozenBrush
Next i
Handler yang Diubah pada Unfrozen Freezables dapat Menjaga Objek Tetap Hidup
Delegasi yang diteruskan sebuah objek ke peristiwa Freezable sebuah objek secara efektif merupakan referensi ke objek tersebut Changed. Oleh karena itu, Changed penanganan aktivitas dapat menjaga objek tetap hidup lebih lama dari yang diharapkan. Saat melakukan pembersihan objek yang telah terdaftar untuk mendengarkan Freezable peristiwa objek Changed , penting untuk menghapus delegasi tersebut sebelum merilis objek.
WPF juga menghubungkan Changed event secara internal. Misalnya, semua properti dependensi yang mengambil Freezable sebagai nilai akan mendengarkan Changed peristiwa secara otomatis. Properti Fill, yang menerima Brush, mengilustrasikan konsep ini.
Brush myBrush = new SolidColorBrush(Colors.Red);
Rectangle myRectangle = new Rectangle();
myRectangle.Fill = myBrush;
Dim myBrush As Brush = New SolidColorBrush(Colors.Red)
Dim myRectangle As New Rectangle()
myRectangle.Fill = myBrush
Saat myBrush ditetapkan ke myRectangle.Fill, delegasi yang merujuk kembali ke objek Rectangle akan ditambahkan ke acara SolidColorBrush objek Changed. Ini berarti kode berikut tidak benar-benar memenuhi myRect syarat untuk pengumpulan sampah:
myRectangle = null;
myRectangle = Nothing
Dalam kasus ini, myBrush masih menjaga myRectangle tetap hidup dan akan memanggilnya kembali saat Changed menyalakan peristiwa tersebut. Perhatikan bahwa menetapkan myBrush ke properti Fill dari Rectangle baru hanya akan menambahkan penangan kejadian lain ke myBrush.
Cara yang disarankan untuk membersihkan jenis objek ini adalah dengan menghapus Brush dari properti Fill, yang pada gilirannya akan menghapus penanganan acara Changed.
myRectangle.Fill = null;
myRectangle = null;
myRectangle.Fill = Nothing
myRectangle = Nothing
Virtualisasi Antarmuka Pengguna
WPF juga menyediakan variasi StackPanel elemen yang secara otomatis "memvirtualisasikan" konten anak yang terikat data. Dalam konteks ini, kata virtualisasi mengacu pada teknik di mana subset objek dihasilkan dari sejumlah besar item data berdasarkan item mana yang terlihat di layar. Proses ini sangat intensif, baik dalam hal memori dan prosesor, dalam menghasilkan banyak elemen UI ketika hanya sedikit elemen yang tampil di layar pada waktu tertentu. VirtualizingStackPanel (melalui fungsionalitas yang disediakan oleh VirtualizingPanel) menghitung item yang terlihat dan bekerja dengan ItemContainerGenerator dari ItemsControl (seperti ListBox atau ListView) untuk hanya membuat elemen untuk item yang terlihat.
Sebagai pengoptimalan performa, objek visual untuk item ini hanya dihasilkan atau tetap hidup jika terlihat di layar. Ketika mereka tidak lagi berada di area kontrol yang dapat dilihat, objek visual dapat dihapus. Ini tidak sama dengan virtualisasi data, di mana objek data tidak semuanya ada dalam koleksi lokal, melainkan dialirkan sesuai kebutuhan.
Tabel di bawah ini menunjukkan waktu yang diperlukan untuk menambahkan dan merender 5000 TextBlock elemen ke dalam StackPanel dan VirtualizingStackPanel. Dalam skenario ini, pengukuran mewakili waktu antara melampirkan string teks ke ItemsSource properti ItemsControl objek ke waktu ketika elemen panel menampilkan string teks.
| Panel Penyelenggara | Waktu render (ms) |
|---|---|
| StackPanel | 3210 |
| VirtualizingStackPanel | 46 |
Lihat juga
- Mengoptimalkan Performa Aplikasi WPF
- Perencanaan untuk Kinerja Aplikasi
- Memanfaatkan Perangkat Keras
- Desain dan Tata Letak
- Grafik dan Pengolahan Citra 2D
- Sumber Daya Aplikasi
- Teks
- Pengikatan Data
- Rekomendasi Performa Lainnya
.NET Desktop feedback