2009-09-29 28 views
13

Tôi hiện đang phát triển một công cụ trực quan để vẽ các hình dạng WPF như đường dẫn, hình elip vv trên Canvas. Tôi đã thực hiện một cách tiếp cận ảo hóa nơi Shapes đang bị phá hủy và tạo ra trên bay tùy thuộc vào khả năng hiển thị của họ. Tuy nhiên, ngay cả chỉ với 600 dấu chấm lửng có thể nhìn thấy, ứng dụng dường như đang gặp khó khăn.Hiệu suất WPF: Hiển thị hàng nghìn đường dẫn/hình dạng trên Canvas

Tùy chọn của tôi để tăng tốc mọi thứ là gì? Tôi đang suy nghĩ vẽ hình dạng nhóm (chúng ta hãy nói 500 tại một thời điểm) như là bitmap minh bạch và chỉ vẽ chúng trên Canvas. Nhưng tôi không biết đó có phải là một ý tưởng tốt hay không ... Từ những gì tôi thu thập điều này đòi hỏi một số loại hack, nếu biến đổi đã được áp dụng:

Điều gì về việc sử dụng một WritableBitmap lớn? Đó có phải là một cách tiếp cận khác?

Trả lời

6

WPF bên dưới bìa hoạt động với bản vẽ và hình học - khi bạn nói bạn đang làm việc với các hình dạng, đó có phải là các UIElements thực tế không? Những yếu tố này nặng hơn một chút. Nếu bạn chỉ sử dụng hình học cơ bản (tốt nhất là dòng) để vẽ bản vẽ, bạn sẽ có được hiệu suất tốt nhất theo kinh nghiệm của mình.

Tôi xoay xở lên đến khoảng 10000 điểm với tốc độ khung hình hợp lý, nhưng bất cứ điều gì phức tạp hơn một dấu chấm sẽ làm chậm mọi thứ xuống (nói, dấu chấm tròn hoặc thậm chí chỉ là hình chữ nhật). Tuy nhiên, hình học cơ bản và bản vẽ cơ bản là cách để đi nếu bạn muốn tránh càng nhiều chi phí WPF càng tốt.

Một bitmap có thể ghi rõ ràng là nhanh hơn, nhưng điều đó có nghĩa là tự mình tăng tất cả các hình dạng đó hoặc lưu vào bộ nhớ cache kết quả nếu nó hầu như là tĩnh. Ngoài ra, bạn sẽ thường muốn áp dụng các phép biến đổi trước khi kết xuất thành bitmap thay vì áp dụng chúng cho chính bitmap được hiển thị.

+0

Tôi hiện đang sử dụng phương pháp này: một lớp VirtualPath lưu trữ dữ liệu Đường dẫn và trả về một Hệ thống WPF.Windows.Shapes.Path ngay sau khi ranh giới của nó hiển thị. – kitsune

+0

Cảm ơn bạn đã chỉ cho tôi đến StreamGeometry, tôi không biết lớp này chưa – kitsune

+1

@kitsune, bạn đã bao giờ hoàn thành "đường dẫn ảo của bạn trả về một con đường ngay khi có thể nhìn thấy" lừa? Tôi nghĩ rằng tôi có thể hưởng lợi từ điều này trong một trong các dự án của tôi –

-1

Phương pháp tiếp cận vũ phu có thể là thực hiện điều khiển ActiveX và hiển thị đồ họa trực tiếp bằng Win32. Tuy nhiên, điều này sẽ hơi khó sử dụng. Kiểm soát vải của QT có thể là một cách tiếp cận ấm áp và mịn hơn cho cùng một kết thúc và nó được ghi nhận để hiển thị loại điều này khá nhanh chóng. Troll cung cấp một trình bao bọc ActiveX cho các phiên bản QT thương mại để có thể tích hợp dễ dàng hơn.

+1

Làm thế nào là điều này liên quan đến một câu hỏi được gắn thẻ 'WPF'? – stakx

2

Tôi biết đây là câu hỏi cũ, tôi chỉ trả lời vì lợi ích của cộng đồng.

Tôi đã nghiên cứu chủ đề một chút và tốt nhất tôi tìm thấy là tạo thủ công DrawingVisuals như bạn nói. Nó tiết kiệm rất nhiều công việc nội bộ cho WPF, vì vậy nó kết thúc nhanh hơn rất nhiều. Tôi đã sử dụng kỹ thuật này để tạo một biểu đồ nhẹ có thể có vài trăm điểm. Đây là bài viết tôi truyền cảm hứng cho bản thân, bạn có thể đã biết về nó.

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/02/how-to-high-performance-graphics-in-wpf.aspx

EDIT: URL mới http://khason.net/blog/how-to-high-performance-graphics-in-wpf/
EDIT: URL Mới hơn: http://dedjo.blogspot.com/2008/03/how-to-high-performance-graphics-in-wpf.html

Chúc may mắn.

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