2009-06-11 18 views
11

Biểu đồ đường XY đơn giản: Trục X sẽ đại diện cho phạm vi hoàn chỉnh các tỷ lệ phần trăm xếp hạng có thể, từ 0% trên một đầu đến 100% ở đầu kia. Cụ thể, giá trị X sẽ đại diện cho việc cắt giảm xếp hạng của chúng tôi hoặc xếp hạng tối thiểu mà một giao dịch có thể có trước khi nó không còn được chấp nhận nữa. Trục Y sẽ hiển thị các giá trị từ 0 đến tổng số giao dịch đã trải qua. Giá trị Y sẽ đại diện cho tổng số giao dịch có xếp hạng lớn hơn giá trị X hiện tại (hoặc lớn hơn hoặc bằng giá trị X hiện tại, tôi chưa quyết định). Không có giao dịch nào sẽ xảy ra khi biểu đồ này được vẽ lần đầu tiên, do đó biểu đồ sẽ bắt đầu tại "y = 0x".WPF có thể hiển thị đường dẫn với 300.000 điểm trên nó trong môi trường có hiệu suất nhạy cảm không?

Giả sử giao dịch đầu tiên được thực hiện, với xếp hạng là 40%. Xếp hạng của giao dịch cho biết giao dịch này có thể chấp nhận được nếu tỷ lệ giảm giá của chúng tôi thấp hơn 40%. (... hoặc nhỏ hơn hoặc bằng 40%. Một lần nữa, tôi vẫn chưa quyết định).

Đầu tiên, trục Y sẽ rescale để hiển thị phạm vi 0-1 (vì 1 là tổng số giao dịch). Sau đó, dòng sẽ được sửa đổi để cho biết rằng 0 giao dịch được chấp nhận từ x = 40 trở lên và 1 giao dịch có thể chấp nhận được từ x = 40 trở xuống. Điều này rất dễ thực hiện trong WPF bằng cách thêm hai điểm vào đường thẳng - một tại (40,0) và điểm kia tại (40,1) - và sau đó di chuyển điểm cuối bên trái của đường thẳng tới (0,1). Điểm cuối bên phải của đường sẽ vẫn ở (100,0). Quá trình này sau đó có thể được lặp lại cho giao dịch thứ hai, v.v.

Vấn đề là chúng tôi sẽ xử lý số lượng giao dịch gồm sáu chữ số. và tôi muốn đảm bảo rằng tôi đang sử dụng khả năng vẽ vector tăng tốc phần cứng của WPF ở mức tối đa để đảm bảo biểu đồ không bị trễ hoặc đóng băng phần còn lại của chương trình khi nó cố gắng hiển thị 300.000 điểm trên một đường đơn. Hoặc là WPF được cho là có khả năng xử lý các con số như vậy trong một nhịp tim? Tôi cần phải tìm cách để triển khai biểu đồ này mà không làm chậm ứng dụng. Tôi tin rằng nền tảng vẽ vector của WPF sẽ cung cấp một giải pháp, nhưng tôi không biết đủ về cách khai thác WPF để chắc chắn rằng tôi đang tận dụng tối đa khả năng dựng hình hiệu suất cao của WPF.

+1

Hãy cho tôi biết thế nào nó hoạt động ra cho bạn. –

+0

Đây là một câu hỏi cũ, nhưng tôi tự hỏi nếu bạn tìm thấy một giải pháp cho vấn đề của bạn? Đã dành khá nhiều thời gian thử nghiệm với hiệu suất cao rendering trong WPF, tôi thấy hiệu suất cao nhất có thể đạt được bằng cách không sử dụng nguyên thủy WPF ở tất cả, nhưng bằng cách sử dụng WriteableBitmap API. Điều đó hoặc Direct2D. Tôi cũng muốn được lắng nghe trải nghiệm của bạn. Trân trọng, –

Trả lời

11

Tôi chỉ tình cờ gặp bài đăng này và đang xây dựng một đồ thị kiểm soát bản thân mình cần phải rất hiệu quả khi chúng tôi cập nhật điểm trên đường của mình theo cách thời gian thực.

Nếu hiệu suất và số lượng của Visual (s) là những gì bạn đang sau ... tôi nghi ngờ bạn sẽ tìm thấy một cách tiếp cận performant hơn lập trình trực tiếp chống lại lớp trực quan WPF của (liên kết: 1, 2). Kết quả ban đầu của tôi khi sử dụng phương pháp này là rất tích cực.

Điều này sẽ có hiệu suất cao hơn so với OnRender quan trọng vì nó sẽ khuyến khích bạn tận dụng lợi thế của hệ thống con của chế độ giữ lại WPF (nơi tất cả các hướng dẫn vẽ được lưu trữ).

Tức là, nếu tất cả những gì bạn phải cập nhật là một điểm trên đường, thì việc cập nhật điểm sẽ buộc dòng trực quan cập nhật nhưng sẽ không buộc phần còn lại của biểu đồ (trục, đường lưới, ...) để cập nhật ... khi hướng dẫn vẽ cho các mục này được giữ lại và sẽ được sử dụng lại (vì chúng không cập nhật).

Chương 14 trong Pro WPF in C# 2008 bởi Matthew MacDonald có một phần tuyệt vời (có tiêu đề 'Hình ảnh') về lập trình chống lại lớp trực quan của WPF. Chương 2 của WPF Control Development Unleashed cũng có phần ở trang 13 nơi ông thảo luận về cách tiếp cận DrawingVisual sẽ là hoàn hảo cho một thành phần biểu đồ. Cuối cùng, Charles Petzold đã viết một Tạp chí MSDN article nơi giải pháp tổng thể tốt nhất cho một âm mưu phân tán là một phương pháp DrawingVisual.

(Bây giờ, tôi biết câu hỏi của bạn đã đề cập đến trục cũng sẽ được cập nhật ... và vì vậy câu trả lời của tôi thực sự là trường hợp chung ... nhưng tôi vẫn nghĩ rằng cách tiếp cận này sẽ có hiệu quả nhất .. chỉ có những thứ cần cập nhật ... sẽ cập nhật.)

+0

Điều này có ý nghĩa hoàn hảo và là mô tả hoàn hảo về cách tiếp cận mà tôi hiện đang cố gắng thực hiện. Biểu đồ tôi đang xây dựng vào tháng 6 được thiết kế theo gợi ý của Paul Betts. Nhưng tôi đã xây dựng một đồ thị tương tự gần đây hơn, và giải pháp này dường như làm việc tuyệt vời. Tất cả những gì tôi làm là cập nhật chỉ số lượng đối tượng ít nhất có thể (trong IValueConverter), và lớp hình ảnh WPF dường như có khả năng xử lý phần còn lại mà không có sự cố. – Giffyguy

+0

Tuyệt vời! Vui mừng khi nghe nó! – cplotts

+0

@Giffyguy: Bạn vẫn đang hiển thị 300.000 điểm dữ liệu hoặc bạn đã giảm chúng? Các điểm dữ liệu này có hiển thị trên một màn hình hay bạn phải cuộn? –

1

Nếu bạn không sử dụng .NET 3.5 SP1, không sử dụng bất kỳ hiệu ứng đổ bóng nào. Nếu không, có isn't much you need to do là nhà phát triển WPF để đảm bảo nó sử dụng khả năng tăng tốc phần cứng.

+4

OK. Nhưng khối lượng công việc này có quá nhiều cho nó không? Ý tôi là, mô tả một mô hình với nhiều điểm đó là khá nhiều hơn một chút so với những gì tôi từng thấy trong mô hình và mô hình hóa của tôi (mặc dù có giới hạn). – Giffyguy

+4

Tôi đoán những gì tôi yêu cầu là: Tôi có nên đi với một đường dẫn đường và thêm điểm khi giao dịch đi qua, hoặc tôi nên nhìn vào một giải pháp nào khác? – Giffyguy

+0

Bạn không có nghĩa là hiệu ứng bitmap? Thay vì hiệu ứng đổ bóng? – cplotts

4

Tôi không biết câu trả lời, nhưng mã hóa một bài kiểm tra nhanh sẽ không mất nhiều thời gian hơn so với khi bạn đăng. Ngoài ra, hãy xem this thread để có một cuộc thảo luận tương tự.

11

Nếu bạn muốn nó nhanh, cách tốt nhất là lấy được từ Kiểm soát và triển khai OnRender - thông thường điều này là không cần thiết, nhưng đối với ứng dụng của bạn thì có thể.

Ngoài ra, chúng ta hãy lùi lại một bước - màn hình bạn đang hiển thị chắc chắn không phải là 300k pixel trên; trước khi bạn kết xuất, giảm bộ đệm bằng cách lấy trung bình các nút n thành một nút cho đến khi bạn có thứ gì đó gần hơn với độ phân giải của thiết bị thực tế, rồi vẽ nó trên màn hình.

+1

OnRender có thể hoạt động hiệu quả hơn so với một số cách tiếp cận ... nhưng hãy cẩn thận khi cố gắng điều khiển WPF theo cách thức tức thời (có thể ghi đè OnRender có thể khuyến khích bạn làm) ... WPF là hệ thống chế độ được giữ lại. Bản thân tôi đã bị cắn bằng cách làm điều này. – cplotts

+0

+1 cho ý tưởng giảm thiểu các điểm trên đường dựa trên độ phân giải của thiết bị. Rất thông minh. – cplotts

+0

Giảm số điểm là nhiều hơn một hack hơn bất cứ điều gì với WPF kể từ khi máy chủ có thể được rescaled (phóng to/thu nhỏ) và hình ảnh không có cách nào để biết kích thước thật của họ trên màn hình. –

4

Có thể đáng xem qua thư viện WPF DynamicDataDisplay. Tôi đã sử dụng nó gần đây và không có bất kỳ vấn đề với số lượng lớn dữ liệu. Nó chỉ là một phiên bản đầu (0,3 trong thực tế) vì vậy không có nhiều tài liệu, nhưng nó có mẫu cho thấy làm thế nào để sử dụng nó. Hy vọng rằng sẽ đủ để bạn bắt đầu.

Mẫu mô phỏng tạo nhiều dữ liệu, vì vậy đó phải là một nơi tốt để bắt đầu.

+0

Bạn có biết WPF DynamicDataDisplay được triển khai như thế nào không? Nó có sử dụng Visuals không? –

+0

Thú vị, chắc chắn. Nhưng cho đến nay điều này nghe có vẻ như nó tập trung nhiều hơn xung quanh dữ liệu động chứ không phải là hiển thị động. Tôi nghi ngờ nó sẽ được sử dụng nhiều cho đầu ra hình ảnh tùy chỉnh, được thiết kế bởi người tạo dữ liệu. – Giffyguy

+0

Họ có các loại biểu đồ khác nhau cho các nhu cầu khác nhau. Một số người đang làm việc trên DirectX Line Graph đóng góp cần được nhanh chóng. Họ có một biểu đồ sử dụng một DrawingContext trực tiếp mà là nhanh nhất cho đến nay. Bất cứ điều gì sử dụng hệ thống nhớ lại sẽ quá chậm đối với 300k điểm dữ liệu riêng biệt (nếu bạn muốn hiển thị tất cả) –

0

IMHO, Paul có vẻ như đang theo dõi right, kiểm tra các phần trên bản đồ làm mịn, một số ví dụ sử dụng kết quả từ cuộc bầu cử Florida 2000 kết quả (~ 9 triệu phiếu 18 + M tổng số người) cho các tập dữ liệu.

Dọc theo các dòng của chủ đề từ AgileJon, phần nào, tôi sẽ sử dụng đơn giản phát ra một bitmap theo cách thủ công nếu không có sẵn kỹ thuật thẳng về phía trước để thu thập dữ liệu của bạn tốt hơn. Tôi hiển thị trực quan các ô phân tán có giá trị 16 000 000 (16 triệu +) trong vài giây, toàn bộ pallet 32 ​​bit ARGB.

Bạn dường như đã nhận xét "Nhưng quay trở lại bitmap có vẻ như một bước lùi khổng lồ", tôi sẽ không nói quá nhanh đến thế, vũ trụ bị ràng buộc bởi giới hạn vật lý.

tôi gọi bài khác để this bài viết CodeProject, mà làm nhiều hàng chục ngàn lô 3D + hoạt hình vv ...

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