Baru-baru ini, saya telah melakukan beberapa optimasi pada kode. Setelah pengujian, efeknya OK, tetapi saya menemukan bahwa antarmuka akan berkedip, khususnya kontrol TreeView akan berkedip, bahasanya C#, dan IDEnya adalah VS2005. Setelah berkonsultasi dengan beberapa informasi dan menggunakan beberapa teknik dasar (seperti mengaktifkan buffering ganda), saya menemukan bahwa hal itu tidak berpengaruh.
Jadi saya menggunakan alat PRfiler untuk mengetahui bahwa hambatannya terletak pada operasi EndUpdate setelah memperbarui antarmuka setiap kali (ini digunakan untuk mengurangi jumlah pembaruan antarmuka, tetapi ini tidak ideal di sini karena ada banyak elemen dalam kontrol) Saya kira setiap kali diperbarui, lapisan bawah .Net Setiap primitif akan diperbarui dan digambar ulang, sehingga kecepatannya akan lambat dan menyebabkan kedipan. Namun jika demikian, penggunaan buffering ganda akan memberikan hasil yang lebih baik. Melihat kodenya lagi, saya menemukan bahwa tindakan pembaruan mungkin terlalu sering, jadi saya mengurangi kecepatan dan menjadi lebih baik, tetapi tetap tidak berhasil.
Terus mencari secara online dan akhirnya menemukan solusi yang lebih sesuai. Ternyata gambar ulang yang mendasarinya akan menghapus kanvas setiap saat dan kemudian menggambar ulang semuanya. Ini adalah penyebab utama kedipan. Jadi operasi fungsi pengiriman pesan kelebihan beban dan pesan ini dinonaktifkan. Kodenya adalah sebagai berikut:
override yang dilindungi batal WndProc(ref Pesan m)
{
if (m.Msg == 0x0014) // Nonaktifkan penghapusan pesan latar belakang
kembali;
base.WndProc(ref m);
}
kesuksesan!
Catatan: Buffer ganda masih berguna ketika pembaruan tidak terlalu sering dan kontrol tidak mengandung terlalu banyak elemen. Jika terdapat terlalu banyak elemen, setiap pembaruan akan memakan waktu lama. Meskipun buffering ganda digunakan, masalah kedipan tidak dapat diselesaikan. Secara pribadi, menurut saya metode yang ideal adalah menonaktifkan dan menghapus pesan latar belakang pada akhirnya.
Lampiran: Beberapa catatan upaya dan kegagalan
1) Gunakan setStyle
Dikatakan di Internet bahwa fungsi setStyle digunakan untuk mengatur parameter kontrol, khususnya:
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, benar);
Yang terakhir dari tiga parameter opsi ini bergantung pada yang pertama dan harus hidup berdampingan, jika tidak maka tidak valid. Dan fungsi ini sendiri dilindungi, jadi Anda harus mewarisi kontrol tertentu terlebih dahulu sebelum menggunakannya.
Sasaran ini konsisten dengan solusi tepat sebelumnya, yang juga menonaktifkan pembersihan latar belakang dan mengaktifkan buffering ganda, tetapi memerlukan opsi menggambar pengguna, dan semua gambar dilakukan oleh pengguna. Ini mengharuskan Anda menerapkan sendiri semua gambar kontrolnya, yang cukup merepotkan. Jadi cara ini bukan sepenuhnya tidak mungkin dilakukan, namun membutuhkan kerja ekstra dan tidak disarankan. Saya juga tidak menggunakannya.
2) Gunakan BeginUpdate dan EndUpdate
Pasangan operasi ini memiliki efek yang lebih baik dalam skenario di mana operasi batch diperlukan untuk memperbarui kontrol, seperti menambahkan node dalam jumlah besar dalam batch selama inisialisasi. Kekurangannya adalah tidak bisa langsung diupdate. Oleh karena itu, ini tidak cocok untuk situasi di mana node sering diperbarui dan ingin segera ditampilkan di antarmuka. Jika Anda menggunakannya dan tidak menonaktifkan pesan antarmuka yang jelas, kontrol akan tampak berkedip-kedip, dan sebagian besar memiliki latar belakang putih, dan konten hampir tidak terlihat (tergantung pada kompleksitas video). Karena pembaruan antarmuka diselesaikan pada EndUpdate, terlalu banyak operasi menyebabkan EndUpdate diblokir untuk waktu yang lama, dan antarmuka dibersihkan terlebih dahulu dan diperbarui kemudian, menyebabkan antarmuka tampak kosong untuk waktu yang lama.
3) Gunakan opsi ControlStyles.EnableNotifyMessage
Efek dari opsi ini juga konsisten dengan solusi yang tepat. Penggunaannya adalah:
SetStyle(ControlStyles.EnableNotifyMessage, benar);
penggantian yang dilindungi batal padaNotifyMessage(Pesan m)
{
//Tulis kode pesan filter di sini
}
Namun, eksperimen sebenarnya tidak menunjukkan efek apa pun. Saya tidak tahu alasannya, dan saya tidak menyelidikinya secara mendetail.
-