2011-01-31 31 views
5

Tôi vẽ rất nhiều dòng trên một khung hình dài (nghĩ sơ đồ) và điều chỉnh khá tốt cho hiệu suất, sử dụng các lớp hình học cấp thấp và đóng băng chúng, v.v. Hiệu suất được cải thiện đáng kể, nhưng vẫn mất vài giây để tải một vài nghìn mục vào khung vẽ. Tôi chạy một phân tích hiệu suất trên ứng dụng, và có vẻ như một tỷ lệ lớn thời gian được thực hiện bởi mỗi cuộc gọi đến canvas.children.add(). Tôi đã đọc rằng đây nên là một cuộc gọi nhẹ, và vì tôi đang gọi nó nhiều lần trong một phương pháp, nó không nên cố gắng để làm bất cứ điều gì nặng nề inbetween ... Có thể có thể có bất kỳ lý do khác này có thể được dùng quá nhiều thời gian? Và bất kỳ cách nào tôi có thể tăng tốc nó?Hiệu suất canvas WPF- children.add được gọi nhiều lần

Hiệu suất không phải là khủng khiếp, nhưng tôi lo sợ nó có thể trở thành vấn đề sau này khi tôi cần xử lý các tập dữ liệu lớn hơn.

Chỉ để tham khảo, có vẻ như nó được gọi là 1400 lần trong mẫu này và mất gần 3 giây thời gian CPU trên một máy tính xách tay hiện đại/nhanh.

Canvas được chứa trong một loạt các điều khiển khác, vì vậy tôi rất tò mò nếu chúng có thể đóng góp cho điều này.

Lưu ý bổ sung: Tôi cũng không đặt chiều cao cụ thể trên canvas, vì nó được đặt để lấp đầy vùng chứa mẹ của lưới. Đây có phải là một nguồn của các vấn đề?

+2

Theo như hiệu suất có liên quan, Bạn có thể thử http : //msdn.microsoft.com/en-us/library/system.windows.media.streamgeometry.aspx Hình học luồng là cấu trúc trọng lượng nhẹ nhất so với bối cảnh vẽ. –

+0

yep, đã sử dụng hình học luồng và có kết quả tốt. cảm ơn –

Trả lời

0

Tôi khuyên bạn nên vẽ trực tiếp các hình dạng của mình vào hình ảnh thay vì thêm chúng dưới dạng con. Trẻ em vẽ có chi phí khổng lồ (như bạn có thể thấy).

Có một câu hỏi tương tự với một tham chiếu đến một số bài viết hữu ích:

How to draw line of ten thousands of points with WPF within 0.5 second?

+0

Đã hy vọng để tránh điều này, vì tôi có những thứ khác đang diễn ra mà có thể làm cho nó phức tạp để luôn vẽ lại. chẳng hạn như, hộp văn bản và hình ảnh được thêm ở trên cùng có thể kéo được và phần này rất dài để tồn tại trong vùng chứa có thể cuộn. Rất nhiều biến cần xem xét ... –

+3

Tùy thuộc vào hiệu suất quan trọng đối với bạn như thế nào, bạn có thể muốn xem xét giải pháp trong một trong nhiều khung chơi trò chơi trong C# (tức là điều gì đó xử lý các sprites). Tất nhiên - nếu bạn cũng muốn sử dụng cơ chế UI Framework khác sẽ không thực sự giúp bạn ... BTW: Trong một số điều kiện nhất định, WPF sẽ không sử dụng hiển thị phần cứng, có thể giảm đáng kể hiệu suất - bạn có thể kiểm tra bằng phương pháp này ' Debug.WriteLine ("WPF RenderCapabilities: Rendering Tier =" + (RenderCapability.Tier >> 16) + "(Mong muốn 2, 0 Có nghĩa là không tăng tốc phần cứng)"); ' – NightDweller

1

Chỉ cần thêm về hệ thống phân cấp của các điều khiển vải là bên trong, và chiều cao của canvas:

sự Canvas luôn chiếm nhiều không gian như đã cho, và không cần biết con bạn thêm gì vào nó - nó KHÔNG BAO GIỜ kích hoạt một đường chuyền Measuer/Arrange mới trên cha mẹ của nó. Để tổng hợp nó - vấn đề không thể đến từ đó, và gợi ý về StreamGeomatry chính xác, đây là nguyên nhân gây ra các vấn đề về hiệu suất, và chuyển sang streamgeormatry sẽ giải quyết nó.

+0

Tôi đã sử dụng phương pháp đo trực tiếp cho tất cả trẻ em được thêm vào. họ đã giúp hiệu suất rất nhiều, nhưng vẫn đang tìm cách cải thiện đáng kể. –

+1

làm một kẻ nói dối ra khỏi tôi- tôi thực sự vết thương lên bằng cách sử dụng phép đo tại một số điểm. Chỉ cần chuyển đổi sang streamgeo và chắc chắn là nhanh hơn. –

+0

-1 bởi vì tôi có cùng một vấn đề, nhưng, tôi đang đối phó với trẻ em của loại hình dạng, và tôi có cùng một hành vi chậm – simo

4

Vấn đề chính là Children.Add luôn là một hoạt động chậm, ngay cả khi bạn sử dụng các đối tượng StreamGeometry. Tôi phải đối mặt với cùng một vấn đề gần đây và kết luận những điều sau đây: Nếu bạn đặt một loạt các đối tượng vào một canvas mới và lồng nó vào khung chính, hiệu suất của hoạt động bổ sung sẽ được tăng lên đáng kể. Vì vậy, thay vì thêm 1400 phần tử, hãy đặt 200 phần tử trong 7 canvas và thêm 7 canvas đó vào canvas chính. Vì tất cả các đối tượng bây giờ thuộc về các khung hình khác nhau, bạn sẽ cần phải điều chỉnh ứng dụng của mình một chút, nhưng điều này sẽ là giải pháp ít phức tạp hơn chuyển sang giải pháp thay thế như DrawingVisual

+0

Jaime, làm thế nào lớn của đạt được perfromance bạn sẽ ước tính từ này? tức là tăng tốc 10% hoặc 100%? Cảm ơn. –

+0

Trong trường hợp cụ thể của tôi (300 đối tượng được thêm vào cùng một lúc trong bộ sưu tập 5000+ trẻ em), tôi đã bị chậm trễ 2,5 giây và trở thành 0,3 giây. –

+0

wow điều đó thực sự tốt. cảm ơn một lần nữa. –

Các vấn đề liên quan