2011-09-26 44 views
8

Tôi đang phát triển một ứng dụng giống như Maps bằng cách sử dụng WPF. Tôi có ~ 10.000 PathGeometry, Shapes được thêm vào canvas. Tôi đã thêm ScaleTransform và TranslateTransform để thu phóng và điều khiển panning.Cải thiện hiệu suất của WPF Canvas

Vấn đề tôi đang gặp phải là khi tôi phóng to hoặc xoay, có độ trễ nhỏ. Có cách nào để tổ chức dữ liệu để tôi chỉ xử lý các Hình dạng hiển thị?

Bất kỳ gợi ý nào về việc làm cho nó hiệu quả hơn sẽ hữu ích và được đánh giá cao.

Trả lời

7

Tôi khuyên bạn nên xem bài viết thú vị này, với khái niệm về Canvas ảo: ZoomableApplication2: A Million Items. Nó cũng có một bản demo trực tuyến (xbap) trực tuyến.

6

Bạn đang đặt những thứ gì trên canvas? Nếu sử dụng pathGeometry, bạn có kèm theo chúng trong lớp Path không? Nếu vậy, Đường dẫn có FrameworkElement trong hệ thống phân cấp siêu lớp của nó, nó chịu trách nhiệm về tổn thất hiệu suất lớn.

Take a look at my question here. Mặc dù đó là về lớp Hình dạng, nhưng lý do xuống cấp hiệu suất là như nhau, FrameworkElement.

Nếu bạn đang làm như vậy, giải pháp là sử dụng PathGeometry thay vào đó, và kèm theo nó trong DrawingContext của một DrawingVisual bằng phương thức DrawingContext.DrawGeometry().

Dưới đây là một số liên kết sẽ trợ giúp. Path Geometry

DrawingContext.DrawGeometry()

Optimizing Performance: 2D Graphics and Imaging

Và vẽ các hình dạng chính mình, bằng sự kết hợp của đường nét, và những thứ khác được cung cấp bởi các lớp thừa kế từ lớp Geometry (ArcGeometry, PathGeometry vv).

Điều này sẽ hữu ích.

2

Nếu bạn muốn hiệu suất cuối cùng để vẽ ngay trong WPF, hãy kiểm tra WriteableBitmapEx. Đây là một thư viện nguồn mở tuyệt vời, mà gần đây tôi đã đóng góp. nó cung cấp khả năng vẽ giống như GDI trên WriteableBitmap và tương thích với Windows Phone, WPF và Silverlight. API là đơn giản, bạn nhận được blitting, đa giác, dòng và hình dạng đơn giản vv ... Bạn sẽ không nhận được datatemplates và gradient brushes tuy nhiên.

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