แผงที่คุณพูดถึงคือแผงเค้าโครงดังนั้นภาพรวมคร่าวๆของระบบเค้าโครงจึงแสดงให้เห็นว่ามันไม่น่าจะเป็นเพียงรายการแผงควบคุมที่มีประสิทธิภาพมากที่สุด แต่คุณใช้แผงควบคุมอย่างไรที่มีผลต่อประสิทธิภาพและประสิทธิภาพมากที่สุด
LayoutSystem_Overview :
ที่ง่ายที่สุดเลย์เอาท์คือระบบวนซ้ำที่นำไปสู่องค์ประกอบที่มีการกำหนดขนาดตำแหน่งและวาด โดยเฉพาะอย่างยิ่งเค้าโครงจะอธิบายกระบวนการวัดและจัดเรียงสมาชิกของคอลเล็กชัน Children ขององค์ประกอบแผง เค้าโครงเป็นกระบวนการที่เข้มข้น ยิ่งคอลเลกชัน Children มีขนาดใหญ่จำนวนการคำนวณที่ต้องทำก็จะมากขึ้น นอกจากนี้ยังสามารถนำความซับซ้อนตามลักษณะการจัดวางที่กำหนดโดยองค์ประกอบแผงที่เป็นเจ้าของคอลเลกชัน แผงควบคุมที่ค่อนข้างเรียบง่ายเช่น Canvas สามารถมีประสิทธิภาพที่ดีกว่าแผงที่ซับซ้อนกว่าอย่างมากเช่น Grid
ทุกครั้งที่ UIElement ลูกเปลี่ยนตำแหน่งจะมีโอกาสที่จะทำให้เกิดการส่งผ่านใหม่โดยระบบเค้าโครง ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องเข้าใจเหตุการณ์ที่สามารถเรียกใช้ระบบเค้าโครงเนื่องจากการเรียกใช้ที่ไม่จำเป็นอาจทำให้แอปพลิเคชันมีประสิทธิภาพต่ำ ต่อไปนี้อธิบายถึงกระบวนการที่เกิดขึ้นเมื่อเรียกใช้ระบบโครงร่าง
1. UIElement ลูกเริ่มต้นกระบวนการเค้าโครงโดยการวัดคุณสมบัติหลักก่อน
2. คุณสมบัติการกำหนดขนาดที่กำหนดบน FrameworkElement จะได้รับการประเมินเช่นความกว้างความสูงและระยะขอบ
3. ใช้ลอจิกเฉพาะแผงเช่นทิศทาง Dock หรือการวางแนวซ้อนกัน
4. เนื้อหาถูกจัดเรียงหลังจากวัดผลเด็กทุกคนแล้ว
5. คอลเลกชันเด็กวาดขึ้นบนหน้าจอ
6. กระบวนการจะถูกเรียกอีกครั้งหากมีการเพิ่ม Children เพิ่มเติมในคอลเลกชันจะใช้ LayoutTransform หรือเรียกว่าเมธอด UpdateLayout
ดูLayoutSystem_Measure_Arrangeสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการวัดและการจัดเรียงเด็ก
LayoutSystem_Performance :
เค้าโครงเป็นกระบวนการแบบวนซ้ำ องค์ประกอบย่อยแต่ละองค์ประกอบในคอลเล็กชัน Children จะได้รับการประมวลผลระหว่างการเรียกใช้ระบบเค้าโครงแต่ละครั้ง ด้วยเหตุนี้จึงควรหลีกเลี่ยงการทริกเกอร์ระบบเลย์เอาต์เมื่อไม่จำเป็น การพิจารณาต่อไปนี้สามารถช่วยให้คุณได้รับประสิทธิภาพที่ดีขึ้น
โปรดทราบว่าการเปลี่ยนแปลงค่าคุณสมบัติใดจะบังคับให้มีการอัปเดตซ้ำโดยระบบโครงร่าง
คุณสมบัติการพึ่งพาซึ่งค่าสามารถทำให้ระบบโครงร่างเริ่มต้นถูกทำเครื่องหมายด้วยแฟล็กสาธารณะ AffectsMeasure และ AffectsArrange ให้เบาะแสที่เป็นประโยชน์ว่าการเปลี่ยนแปลงค่าคุณสมบัติใดจะบังคับให้มีการอัปเดตซ้ำโดยระบบโครงร่าง โดยทั่วไปคุณสมบัติใด ๆ ที่สามารถส่งผลกระทบต่อขนาดของกล่องขอบเขตขององค์ประกอบควรมีการตั้งค่าสถานะ AffectsMeasure เป็นจริง สำหรับข้อมูลเพิ่มเติมโปรดดูภาพรวมคุณสมบัติการพึ่งพา
หากเป็นไปได้ให้ใช้ RenderTransform แทน LayoutTransform
LayoutTransform เป็นวิธีที่มีประโยชน์มากในการส่งผลต่อเนื้อหาของอินเทอร์เฟซผู้ใช้ (UI) อย่างไรก็ตามหากผลของการแปลงไม่ต้องส่งผลกระทบต่อตำแหน่งขององค์ประกอบอื่น ๆ ควรใช้ RenderTransform แทนเนื่องจาก RenderTransform ไม่เรียกใช้ระบบเค้าโครง LayoutTransform ใช้การเปลี่ยนแปลงและบังคับให้มีการอัปเดตโครงร่างแบบเรียกซ้ำเพื่อพิจารณาตำแหน่งใหม่ขององค์ประกอบที่ได้รับผลกระทบ
หลีกเลี่ยงการเรียก UpdateLayout โดยไม่จำเป็น
วิธีการ UpdateLayout บังคับให้มีการอัปเดตโครงร่างแบบวนซ้ำและมักไม่จำเป็น เว้นแต่คุณจะแน่ใจว่าจำเป็นต้องมีการอัปเดตเต็มรูปแบบให้พึ่งพาระบบเค้าโครงเพื่อเรียกวิธีนี้ให้คุณ
เมื่อทำงานกับคอลเล็กชัน Children ขนาดใหญ่ให้พิจารณาใช้ VirtualizingStackPanel แทน StackPanel ปกติ
ด้วยการจำลองคอลเล็กชันลูก VirtualizingStackPanel จะเก็บเฉพาะออบเจ็กต์ในหน่วยความจำที่อยู่ใน ViewPort ของพาเรนต์เท่านั้น เป็นผลให้ประสิทธิภาพดีขึ้นอย่างมากในสถานการณ์ส่วนใหญ่
การเพิ่มประสิทธิภาพ: เลย์เอาต์และการออกแบบ : บทความนี้จะอธิบายรายละเอียดเกี่ยวกับวิธีการสร้างต้นไม้อย่างมีประสิทธิภาพและให้รายการพาเนลง่ายๆตามความซับซ้อน
ผ้าใบ (ส่วนประกอบน้อยที่สุด = มีประสิทธิภาพและประสิทธิภาพที่ดีขึ้น)
ตะแกรง
แผงอื่น ๆ (ซับซ้อนมากขึ้น = มีประสิทธิภาพน้อยลงและประสิทธิภาพแย่ลง)
ข้อควรพิจารณาด้านประสิทธิภาพอื่น ๆ ที่ควรคำนึงถึง: วิธีปรับปรุงความเร็วในการเรนเดอร์ WPF UI
- แคชทุกอย่าง พู่กัน, สี, รูปทรงเรขาคณิต, ข้อความที่จัดรูปแบบ, กราฟฟิค (ตัวอย่างเช่นเรามีสองคลาส: RenderTools และ TextCache กระบวนการเรนเดอร์ของแต่ละหน่วยที่อยู่ไปยังอินสแตนซ์ที่ใช้ร่วมกันของทั้งสองคลาสดังนั้นหากสองแผนภูมิมีข้อความเหมือนกันการจัดเตรียมจะดำเนินการเพียงครั้งเดียว)
- Freeze Freezable หากคุณวางแผนที่จะใช้งานเป็นเวลานาน โดยเฉพาะรูปทรงเรขาคณิต รูปทรงที่ไม่ได้รับการแช่แข็งที่ซับซ้อนจะดำเนินการ HitTest ช้ามาก
- เลือกวิธีที่เร็วที่สุดในการเรนเดอร์ดั้งเดิมแต่ละรายการ ตัวอย่างเช่นมีวิธีการแสดงข้อความประมาณ 6 วิธี แต่วิธีที่เร็วที่สุดคือ DrawingContext.DrawGlyphs
- เปิดใช้งานการรีไซเคิลตู้คอนเทนเนอร์ Virtualization นำมาซึ่งการปรับปรุงประสิทธิภาพมากมาย แต่คอนเทนเนอร์จะถูกกำจัดและสร้างขึ้นใหม่ซึ่งเป็นค่าเริ่มต้น แต่คุณสามารถเพิ่มประสิทธิภาพได้ด้วยการรีไซเคิลคอนเทนเนอร์โดยการตั้งค่า VirtualizingStackPanel.VirtualizationMode = "Recycling"
- จากที่นี่ : ไม่มีข้อ จำกัด ในทางปฏิบัติเกี่ยวกับจำนวนการซ้อนที่แอปพลิเคชันของคุณสามารถรองรับได้อย่างไรก็ตามโดยทั่วไปควร จำกัด แอปพลิเคชันของคุณให้ใช้เฉพาะแผงที่จำเป็นสำหรับรูปแบบที่คุณต้องการเท่านั้น ในหลายกรณีองค์ประกอบกริดสามารถใช้แทนพาเนลที่ซ้อนกันได้เนื่องจากมีความยืดหยุ่นในฐานะคอนเทนเนอร์โครงร่าง วิธีนี้สามารถเพิ่มประสิทธิภาพในแอปพลิเคชันของคุณได้โดยการเก็บองค์ประกอบที่ไม่จำเป็นออกจากต้นไม้