พาเนลใดมีประสิทธิภาพสูงสุดในแง่ของเวลาในการแสดงผลและประสิทธิภาพ


127

มีหลายครั้งที่แผงมากกว่าหนึ่งแผงจะเหมาะกับเลย์เอาต์ที่ฉันต้องการอย่างไรก็ตามฉันรู้ว่าเวลาในการแสดงผลสำหรับประเภทแผงต่างๆมีความแตกต่างกัน

ตัวอย่างเช่นMSDNระบุว่า

ค่อนข้างง่ายPanelเช่นCanvasสามารถมีประสิทธิภาพที่ดีกว่าที่ซับซ้อนกว่าอย่างเห็นได้ชัดPanelเช่นGrid.

ดังนั้นในแง่ของเวลาในการเรนเดอร์และประสิทธิภาพพาเนล WPF มีประสิทธิภาพมากที่สุดในลำดับใด

แผง WPF:

  • Canvas
  • DockPanel
  • Grid
  • UniformGrid
  • StackPanel
  • WrapPanel
  • VirtualizingPanel / VirtualizingStackPanel

ฉันค่อนข้างแน่ใจว่าฉันเห็นรายการนี้ที่ไหนสักแห่งทางออนไลน์ แต่ตอนนี้ฉันหาไม่เจอ

คำตอบที่ดีที่สุดที่ฉันกำลังมองหาคือให้รายการแผงควบคุมตามลำดับที่แสดงผลเร็วที่สุด ฉันเข้าใจว่าจำนวนเด็กเป็นปัจจัยสำคัญที่ทำให้แผงควบคุมมีประสิทธิภาพดังนั้นสำหรับคำถามนี้สมมติว่าแต่ละแผงมีเพียงคู่Label/ TextBoxคู่

นอกจากนี้ฉันต้องการรายการข้อยกเว้นเช่นแผงควบคุมเฉพาะที่ทำงานได้ดีกว่าแผงอื่น ๆ ตามเงื่อนไขบางประการ

ปรับปรุง

เพื่อสรุปตามคำตอบที่ยอมรับด้านล่างประสิทธิภาพของแผงควบคุมจะขึ้นอยู่กับจำนวนและรูปแบบของรายการย่อยอย่างไรก็ตามโดยทั่วไปรายการจากเร็วที่สุดไปยังช้าที่สุดคือ:

  • Canvas
  • StackPanel
  • WrapPanel
  • DockPanel
  • Grid

นอกจากนี้VirtualizingPanel/ VirtualizingStackPanelควรจะใช้ในกรณีที่มีจำนวนมากของรายการที่ไม่เคยพอดีกับหน้าจอ

เราขอแนะนำให้คุณอ่านคำตอบที่ยอมรับด้านล่างสำหรับรายละเอียดเพิ่มเติมก่อนที่จะเลือกรายการจากรายการนี้


เป็นเรื่องไร้เดียงสาที่จะสันนิษฐานว่าพาเนลการจำลองเสมือนจะทำงานได้ดีกว่าพาเนลที่ไม่ใช่การจำลองเสมือนจริงหรือไม่?
BoltClock

@BoltClock ฉันคิดว่ามันขึ้นอยู่กับจำนวนเนื้อหาที่มองไม่เห็นในแผงควบคุม หากมีรายการที่มองไม่เห็นจำนวนมาก a VirtualizingStackPanelจะทำงานได้ดีกว่าแน่นอน แต่ถ้ามองเห็นรายการทั้งหมดที่แสดงในแผงควบคุมได้ดีกว่าที่ฉันคิดว่าควรใช้แผงควบคุมปกติ
Rachel

ขอบคุณ มันสมเหตุสมผลแล้วที่มันจะเป็นไอเท็ม virtualizing ที่สิ้นเปลืองเมื่อของทั้งหมดจะแสดงอยู่ดี
BoltClock

นอกเหนือจากการจำลองเสมือนแล้วยังมีคุณสมบัติที่แตกต่างกันหรือจะไม่แยกการควบคุม ฉันไปกับสิ่งที่ให้ UI ที่ดีที่สุดแก่ลูกค้า
paparazzo

1
คุณแน่ใจหรือไม่ว่ามีความแตกต่างที่เห็นได้ชัดเจน (นอกเหนือจาก Virtualizing) สิ่งที่ต้องทำก็คือใช้อัลกอริทึมการจัดวางที่มีน้ำหนักเบา เล็ก ๆ เมื่อเทียบกับการแสดงผลทั้งหมดที่จะตามมา ต้องบอกว่ากริดน่าจะช้าที่สุด (การปรับขนาดแบบถ่วงน้ำหนัก)
Henk Holterman

คำตอบ:


130

ฉันคิดว่าการอธิบายลักษณะการทำงานของแต่ละพาเนลนั้นกระชับและเข้าใจได้ง่ายกว่าการพยายามเปรียบเทียบประสิทธิภาพสัมพัทธ์แบบสัมบูรณ์

WPF ทำให้สองรอบเมื่อแสดงเนื้อหา: วัดและจัดเรียง แต่ละแผงมีลักษณะการทำงานที่แตกต่างกันสำหรับการผ่านทั้งสองนี้

ประสิทธิภาพของการวัดผ่านจะได้รับผลกระทบมากที่สุดจากความสามารถของแผงควบคุมในการรองรับการยืดโดยใช้การจัดตำแหน่ง (หรืออัตโนมัติในกรณีของGrid) และจำนวนลูกที่ยืดหรือปรับขนาดอัตโนมัติ ประสิทธิภาพของการจัดเรียงผ่านจะได้รับผลกระทบจากความซับซ้อนของปฏิสัมพันธ์ระหว่างตำแหน่งเลย์เอาต์ของเด็กที่แตกต่างกันและแน่นอนว่าจำนวนเด็ก

ในบางครั้งแผงควบคุมที่กำหนดก็ไม่สามารถใช้ประโยชน์จากเค้าโครงที่ต้องการได้ง่ายๆ ฉันสร้างตัวควบคุมที่ต้องการจำนวนรายการโดยพลการเพื่อให้แต่ละรายการอยู่ในตำแหน่งที่เปอร์เซ็นต์หนึ่งของพื้นที่ว่าง ไม่มีตัวควบคุมเริ่มต้นทำสิ่งนี้ ความพยายามที่จะทำให้พวกเขาทำสิ่งนี้ (ผ่านการผูกกับขนาดจริงของพ่อแม่) ส่งผลให้เกิดประสิทธิภาพที่น่ากลัว ฉันสร้างแผงเลย์เอาต์ตาม Canvas ซึ่งได้ผลลัพธ์ที่ต้องการโดยใช้งานน้อยที่สุด (ฉันคัดลอกซอร์สสำหรับแคนวาสและแก้ไขประมาณ 20 บรรทัด)

แผงที่มีจำหน่าย:

  • ผ้าใบ

    กำหนดพื้นที่ที่คุณสามารถวางตำแหน่งองค์ประกอบลูกอย่างชัดเจนโดยใช้พิกัดที่สัมพันธ์กับพื้นที่ Canvas

    Canvas มีประสิทธิภาพที่ดีที่สุดของแผงทั้งหมดสำหรับการจัดเรียงเนื่องจากแต่ละรายการได้รับการกำหนดตำแหน่งแบบคงที่ การผ่านการวัดยังมีประสิทธิภาพที่ยอดเยี่ยมเนื่องจากไม่มีแนวคิดในการยืดในแผงควบคุมนี้ เด็กแต่ละคนใช้ขนาดดั้งเดิม

  • DockPanel

    กำหนดพื้นที่ที่คุณสามารถจัดเรียงองค์ประกอบลูกในแนวนอนหรือแนวตั้งโดยสัมพันธ์กัน

    Dockpanel มีโครงร่างเค้าโครงที่เรียบง่ายมากซึ่งมีการเพิ่มรายการทีละรายการเมื่อเทียบกับรายการก่อนหน้าที่เพิ่ม โดยค่าเริ่มต้นความสูงหรือความกว้างจะถูกกำหนดโดยขนาดดั้งเดิมของรายการ (ขึ้นอยู่กับบน / ล่างเทียบกับซ้าย / ขวาตามลำดับ) และทิศทางอื่น ๆ จะถูกกำหนดโดยDockคุณสมบัติหากไม่ได้กำหนดความกว้างหรือความสูง การส่งผ่านการวัดปานกลางถึงเร็วและการจัดเรียงแบบเร็วปานกลางถึงเร็ว

  • ตะแกรง

    กำหนดพื้นที่กริดที่ยืดหยุ่นซึ่งประกอบด้วยคอลัมน์และแถว

    นี่อาจเป็นแผงควบคุมที่เน้นประสิทธิภาพสูงสุดหากใช้การปรับขนาดตามสัดส่วนหรือการปรับขนาดอัตโนมัติ การคำนวณขนาดรายการย่อยอาจเป็นการผสมผสานที่ซับซ้อนระหว่างขนาดดั้งเดิมของรายการและโครงร่างที่ระบุโดยกริด เค้าโครงยังซับซ้อนที่สุดในบรรดาแผงทั้งหมด ประสิทธิภาพช้าถึงปานกลางสำหรับการส่งผ่านการวัดและประสิทธิภาพช้าถึงปานกลางสำหรับการจัดเรียง

  • StackPanel

    จัดเรียงองค์ประกอบลูกเป็นบรรทัดเดียวที่สามารถวางแนวนอนหรือแนวตั้ง

    StackPanel วัดระดับลูก ๆ โดยใช้การปรับขนาดแบบเนทีฟหรือแบบสัมพัทธ์ในทิศทางตรงกันข้ามจากการวางแนวและการปรับขนาดเนทีฟในทิศทางของการวางแนว (การจัดแนวจะไม่ทำอะไรในทิศทางนี้) ทำให้เป็นนักแสดงระดับกลางในพื้นที่นี้ Arrangement pass เป็นเพียงการจัดเรียงรายการตามลำดับ อาจเป็นผลงานที่ดีที่สุดเป็นอันดับสองสำหรับบัตรผ่านนี้ ประสิทธิภาพปานกลางสำหรับการผ่านการวัดและประสิทธิภาพที่รวดเร็วสำหรับเลย์เอาต์พาส

  • VirtualizingPanel

    จัดเตรียมกรอบสำหรับองค์ประกอบแผงที่จำลองการรวบรวมข้อมูลลูกของพวกเขา นี่คือคลาสนามธรรม

    คลาสพื้นฐานสำหรับการใช้พาเนลการจำลองเสมือนของคุณเอง โหลดเฉพาะรายการที่มองเห็นได้เพื่อป้องกันการใช้หน่วยความจำและโปรเซสเซอร์โดยไม่จำเป็น มีประสิทธิภาพมากขึ้นสำหรับชุดรายการ อาจมีประสิทธิภาพน้อยกว่าเล็กน้อยสำหรับรายการที่พอดีกับหน้าจอเนื่องจากการตรวจสอบขอบเขต SDK มีคลาสย่อยเพียงคลาสเดียวเท่านั้นคือVirtualizingStackPanel.

  • WrapPanel

    วางตำแหน่งองค์ประกอบลูกในตำแหน่งตามลำดับจากซ้ายไปขวาทำลายเนื้อหาไปยังบรรทัดถัดไปที่ขอบของกล่องบรรจุ ลำดับต่อมาเกิดขึ้นตามลำดับจากบนลงล่างหรือขวาไปซ้ายขึ้นอยู่กับค่าของคุณสมบัติการวางแนว

    บัตรผ่านการวัดเป็นบัตรผ่านที่ค่อนข้างซับซ้อนโดยรายการที่ใหญ่ที่สุดสำหรับแถวหนึ่ง ๆ จะกำหนดความสูงของแถวจากนั้นแต่ละรายการในแถวนั้นจะใช้ความสูงดั้งเดิม (ถ้ามี) หรือความสูงของแถว เลย์เอาต์พาสนั้นเรียบง่ายโดยวางแต่ละรายการทีละรายการในแถวแล้วดำเนินการต่อในแถวถัดไปเมื่อไม่มีที่ว่างเพียงพอสำหรับรายการถัดไป ผ่านการวัดประสิทธิภาพปานกลาง ประสิทธิภาพปานกลางถึงเร็วสำหรับการจัดเรียงผ่าน

อ้างอิง:

ใช้แผงที่มีประสิทธิภาพสูงสุดเท่าที่จะทำได้

ความซับซ้อนของขั้นตอนการจัดวางขึ้นอยู่กับลักษณะการทำงานของโครงร่างขององค์ประกอบที่ได้มาจากพาเนลที่คุณใช้โดยตรง ตัวอย่างเช่นตัวควบคุม Grid หรือ StackPanel มีฟังก์ชันมากกว่าตัวควบคุม Canvas ราคาสำหรับฟังก์ชันการทำงานที่เพิ่มมากขึ้นนี้เป็นต้นทุนด้านประสิทธิภาพที่เพิ่มขึ้น อย่างไรก็ตามหากคุณไม่ต้องการฟังก์ชันที่ตัวควบคุมกริดมีให้คุณควรใช้ทางเลือกที่มีค่าใช้จ่ายน้อยกว่าเช่น Canvas หรือแผงแบบกำหนดเอง

จากการเพิ่มประสิทธิภาพ: เค้าโครงและการออกแบบ

ระบบเลย์เอาต์เสร็จสิ้นสองรอบสำหรับสมาชิกแต่ละคนของคอลเลคชัน Children บัตรผ่านการวัดและการจัดเรียง พาเนลลูกแต่ละตัวมีเมธอด MeasureOverride และ ArrangeOverride ของตัวเองเพื่อให้บรรลุพฤติกรรมการจัดวางเฉพาะของตนเอง

ในระหว่างการวัดผลสมาชิกแต่ละคนของคอลเล็กชัน Children จะได้รับการประเมิน กระบวนการเริ่มต้นด้วยการเรียกใช้วิธีการวัด วิธีนี้เรียกว่าภายในการนำองค์ประกอบพาเนลพาเรนต์ไปใช้และไม่จำเป็นต้องเรียกอย่างชัดเจนเพื่อให้เค้าโครงเกิดขึ้น

อันดับแรกคุณสมบัติขนาดดั้งเดิมของ UIElement จะได้รับการประเมินเช่นคลิปและการมองเห็น สิ่งนี้จะสร้างค่าที่ชื่อว่า constraintSize ที่ส่งผ่านไปยัง MeasureCore

ประการที่สองคุณสมบัติของเฟรมเวิร์กที่กำหนดบน FrameworkElement จะถูกประมวลผลซึ่งมีผลต่อค่าของ constraintSize โดยทั่วไปคุณสมบัติเหล่านี้จะอธิบายลักษณะการปรับขนาดของ UIElement ที่อยู่ภายใต้เช่นความสูงความกว้างระยะขอบและรูปแบบ แต่ละคุณสมบัติเหล่านี้สามารถเปลี่ยนช่องว่างที่จำเป็นในการแสดงองค์ประกอบได้ MeasureOverride จะถูกเรียกด้วย constraintSize เป็นพารามิเตอร์

หมายเหตุมีความแตกต่างระหว่างคุณสมบัติของ Height and Width กับ ActualHeight และ ActualWidth ตัวอย่างเช่นคุณสมบัติ ActualHeight คือค่าที่คำนวณตามอินพุตความสูงอื่น ๆ และระบบเค้าโครง ค่านี้กำหนดโดยระบบเลย์เอาต์เองตามการส่งผ่านการเรนเดอร์จริงและอาจล้าหลังเล็กน้อยจากค่าคุณสมบัติที่ตั้งไว้เช่นความสูงซึ่งเป็นพื้นฐานของการเปลี่ยนแปลงอินพุต เนื่องจาก ActualHeight เป็นค่าที่คำนวณได้คุณควรทราบว่าอาจมีการเปลี่ยนแปลงที่รายงานหลายรายการหรือเพิ่มขึ้นอันเป็นผลมาจากการดำเนินการต่างๆโดยระบบเค้าโครง ระบบเค้าโครงอาจกำลังคำนวณพื้นที่การวัดที่ต้องการสำหรับองค์ประกอบลูกข้อ จำกัด ขององค์ประกอบหลักและอื่น ๆ เป้าหมายสูงสุดของการวัดผลคือเพื่อให้เด็กกำหนด DesiredSize ซึ่งเกิดขึ้นระหว่างการเรียก MeasureCore ค่า DesiredSize ถูกจัดเก็บโดย Measure เพื่อใช้ในระหว่างการจัดเรียงเนื้อหา

การจัดการผ่านเริ่มต้นด้วยการเรียกใช้วิธีการจัดเรียง ในระหว่างการจัดเรียงองค์ประกอบพาเนลพาเรนต์จะสร้างสี่เหลี่ยมผืนผ้าที่แสดงถึงขอบเขตของเด็ก ค่านี้ถูกส่งผ่านไปยังเมธอด ArrangeCore สำหรับการประมวลผล

เมธอด ArrangeCore ประเมิน DesiredSize ของเด็กและประเมินระยะขอบเพิ่มเติมใด ๆ ที่อาจส่งผลต่อขนาดที่แสดงผลขององค์ประกอบ ArrangeCore สร้าง ArrangeSize ซึ่งส่งผ่านไปยังเมธอด ArrangeOverride ของ Panel เป็นพารามิเตอร์ ArrangeOverride สร้าง finalSize ของเด็ก ในที่สุดเมธอด ArrangeCore จะทำการประเมินคุณสมบัติออฟเซ็ตขั้นสุดท้ายเช่นระยะขอบและการจัดตำแหน่งและวางชายด์ไว้ในสล็อตเค้าโครง เด็กไม่จำเป็นต้อง (และมักจะไม่) เติมเต็มพื้นที่ที่จัดสรรทั้งหมด จากนั้นการควบคุมจะถูกส่งกลับไปที่พาเนลหลักและกระบวนการเค้าโครงจะเสร็จสมบูรณ์

จากการวัดและการจัดเด็ก


1
ในการตอบกลับความคิดเห็นที่ถูกลบไปแล้ว: ฉันไม่ได้รวมเมตริกเพราะจะไม่เป็นประโยชน์ สเปรดชีตมีชุดค่าผสมมากเกินไปที่จะเป็นประโยชน์ วิธีการที่มีประโยชน์มากกว่าในการเพิ่มประสิทธิภาพคือการใช้ความเข้าใจทั่วไปในการเลือกแผงเค้าโครงเริ่มต้นจากนั้นปรับให้เหมาะสมตามความจำเป็นโดยใช้การวิเคราะห์สถานการณ์จริง
N_A

ขอบคุณคำอธิบายของคุณว่าพาเนล WPF แสดงผลได้อย่างไรและประสิทธิภาพการวัด / จัดเรียงของแต่ละพาเนลดีกว่าที่ฉันขอ :)
Rachel

@mydogisbox ฉันไม่เห็นUniformGridรายการของคุณที่ไหนเลย คุณจะสามารถอัปเดตคำตอบของคุณด้วยแผงควบคุมนั้นได้หรือไม่และประสิทธิภาพการวัด / จัดเรียงโดยประมาณนั้นสัมพันธ์กับแผงควบคุมประเภทอื่น ๆ หรือไม่
Rachel

1
@ Rachel UniformGridไม่ได้มีไว้สำหรับใช้ในรูปแบบแอปพลิเคชัน ดู "Derived Panel Elements" ที่นี่: msdn.microsoft.com/en-us/library/ms754152.aspxสำหรับข้อมูลเพิ่มเติม ความเร็วที่ชาญฉลาดควรเร็วกว่า a DockPanelและช้ากว่า a Canvas.
N_A

12

บางทีนี่อาจจะช่วยคุณได้

ไม่เพียง แต่สำหรับพาเนล แต่ยังสำหรับทุกแอปพลิเคชันที่คุณต้องการสร้างใน WPF

สรุปผลการวาดและการวัด WPF

นอกจากนี้ยังมีแอปพลิเคชันการทดสอบรูปวาดผลลัพธ์และข้อมูลข้อสรุปสำหรับระบบปฏิบัติการต่างๆที่คุณต้องการกำหนดเป้าหมาย


8

แผงที่คุณพูดถึงคือแผงเค้าโครงดังนั้นภาพรวมคร่าวๆของระบบเค้าโครงจึงแสดงให้เห็นว่ามันไม่น่าจะเป็นเพียงรายการแผงควบคุมที่มีประสิทธิภาพมากที่สุด แต่คุณใช้แผงควบคุมอย่างไรที่มีผลต่อประสิทธิภาพและประสิทธิภาพมากที่สุด

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

  1. แคชทุกอย่าง พู่กัน, สี, รูปทรงเรขาคณิต, ข้อความที่จัดรูปแบบ, กราฟฟิค (ตัวอย่างเช่นเรามีสองคลาส: RenderTools และ TextCache กระบวนการเรนเดอร์ของแต่ละหน่วยที่อยู่ไปยังอินสแตนซ์ที่ใช้ร่วมกันของทั้งสองคลาสดังนั้นหากสองแผนภูมิมีข้อความเหมือนกันการจัดเตรียมจะดำเนินการเพียงครั้งเดียว)
  2. Freeze Freezable หากคุณวางแผนที่จะใช้งานเป็นเวลานาน โดยเฉพาะรูปทรงเรขาคณิต รูปทรงที่ไม่ได้รับการแช่แข็งที่ซับซ้อนจะดำเนินการ HitTest ช้ามาก
  3. เลือกวิธีที่เร็วที่สุดในการเรนเดอร์ดั้งเดิมแต่ละรายการ ตัวอย่างเช่นมีวิธีการแสดงข้อความประมาณ 6 วิธี แต่วิธีที่เร็วที่สุดคือ DrawingContext.DrawGlyphs
  4. เปิดใช้งานการรีไซเคิลตู้คอนเทนเนอร์ Virtualization นำมาซึ่งการปรับปรุงประสิทธิภาพมากมาย แต่คอนเทนเนอร์จะถูกกำจัดและสร้างขึ้นใหม่ซึ่งเป็นค่าเริ่มต้น แต่คุณสามารถเพิ่มประสิทธิภาพได้ด้วยการรีไซเคิลคอนเทนเนอร์โดยการตั้งค่า VirtualizingStackPanel.VirtualizationMode = "Recycling"
  5. จากที่นี่ : ไม่มีข้อ จำกัด ในทางปฏิบัติเกี่ยวกับจำนวนการซ้อนที่แอปพลิเคชันของคุณสามารถรองรับได้อย่างไรก็ตามโดยทั่วไปควร จำกัด แอปพลิเคชันของคุณให้ใช้เฉพาะแผงที่จำเป็นสำหรับรูปแบบที่คุณต้องการเท่านั้น ในหลายกรณีองค์ประกอบกริดสามารถใช้แทนพาเนลที่ซ้อนกันได้เนื่องจากมีความยืดหยุ่นในฐานะคอนเทนเนอร์โครงร่าง วิธีนี้สามารถเพิ่มประสิทธิภาพในแอปพลิเคชันของคุณได้โดยการเก็บองค์ประกอบที่ไม่จำเป็นออกจากต้นไม้

2
คำตอบนี้ประกอบด้วยการคัดลอกและวางจากแหล่งอื่น ๆ เกือบทั้งหมดบางส่วนไม่ได้ระบุแหล่งที่มา จะดีกว่ามากถ้าคุณตัดทอนเฉพาะส่วนที่เกี่ยวข้องระบุแหล่งที่มาทั้งหมดอย่างถูกต้องและพยายามตอบคำถามให้ตรงประเด็นมากขึ้น
N_A

2
@mydogisbox คำตอบคือการรวบรวมข้อมูลเว็บไซต์เดียวกับที่คุณใช้ในคำตอบของคุณฉันอาจเพิ่ม เพื่อไม่คำนึงถึงแง่มุมอื่น ๆ ที่การเปลี่ยนแปลงประสิทธิภาพอาจทำให้ได้คำตอบที่ไม่สมบูรณ์หรือผู้ถามยังคงมีคำถามเพิ่มเติมดังนั้นฉันจึงเลือกที่จะรวมไว้ ในขณะที่ Rachel ที่มีตัวแทน 21.7K ที่น่าทึ่งและประสบการณ์ WPF จำนวนมากอาจรู้ข้อมูลนี้แล้วคนอื่น ๆ ที่กำลังดูคำถามนี้อาจต้องการข้อมูลเพิ่มเติมและน่าเชื่อถือนี้พร้อมกับคำตอบ
Erick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.