2010-03-25 30 views
9

Tôi đã cố gắng tìm ra cách thích hợp để hiển thị dữ liệu thời gian thực dưới dạng biểu đồ đường trong WPF là gì. Và theo thời gian thực tôi thực sự muốn nói, dữ liệu đang được thu thập từ thiết bị USB tạo dữ liệu ở tốc độ khoảng 40Hz. Có nhiều luồng dữ liệu (tối đa 7) mà tôi đang đọc ở 40Hz theo kiểu không đồng bộ.Biểu đồ/hình ảnh hóa WPF của dữ liệu thời gian thực

Tôi đã thử sử dụng hai giải pháp kệ (biểu đồ Bộ công cụ WPF và biểu đồ Swordfish) và gần như nhìn vào thành phần Hình ảnh động dữ liệu nhưng đã từ bỏ nó sau khi đọc một số nhận xét trên diễn đàn của họ. Dường như các giải pháp biểu đồ không có sẵn được hướng tới các biểu đồ tĩnh và tôi thực sự cần một cái gì đó tương tự như Trình quản lý tác vụ Windows - chỉ nhanh hơn nhiều và với nhiều điểm dữ liệu hơn.

Hiện tại, tôi đã thực hiện giải pháp của riêng mình mà dường như hoạt động tốt nhất cho đến nay nhưng tôi có cảm giác rằng tôi đang thiếu thứ gì đó vì có vẻ như tôi có thể đạt được hiệu suất tốt hơn.

Yêu cầu là nó có thể xử lý khoảng không đổi khoảng 10000 điểm trong cửa sổ trượt - khi dữ liệu mới xuất hiện (ở 40Hz), dữ liệu cũ được đẩy sang bên trái bên ngoài phạm vi hiển thị. Và nó cần phải duy trì tỷ lệ này trong ít nhất 20 - 30 phút (tổng cộng khoảng 75 - 100 nghìn điểm cho mỗi luồng dữ liệu).

Triển khai tùy chỉnh hiện tại của tôi dựa trên thành phần được kế thừa từ Hình dạng và sử dụng StreamingGeometry cho DefinigGeometry. Dữ liệu đến từ thiết bị được chuyển đến thành phần thông qua hàng đợi để cải thiện hiệu suất do "hiệu ứng bùng nổ" vốn có và sau khi thao tác khử, thành phần bị vô hiệu.

Vì vậy, câu hỏi của tôi là, tôi đang đi đúng hướng hay tôi hoàn toàn sai? Cách hiệu quả nhất để thực hiện việc hiển thị dữ liệu như vậy trong WPF là gì? Bất kỳ trợ giúp hoặc gợi ý nào sẽ được đánh giá cao.

+0

InterX interop là hướng. Một số sẽ sử dụng slimDX nhưng đó là một phụ thuộc rất lớn và đường cong học tập trừu tượng. Tôi khuyên bạn nên sử dụng trực tiếp DX9 hoặc (DX11 qua DXGI) vì nó lắc tay với giao diện WP3 D3DImage. Vẫn là một đường cong học tập nhưng giống như slimdx và dễ bảo trì hơn để tạo ra một thiết bị DX, bối cảnh, bộ đệm, đổ bóng và tải ứng dụng của bạn bằng Direct3D. Tài liệu thật khủng khiếp nhưng đủ tốt và khi hoàn thành, bạn đã hoàn thành một thứ gì đó tuyệt vời mà không phụ thuộc vào người khác. Xem thế giới thực của chúng tôi [demo biểu đồ 18 triệu] (http://www.gigasoft.com) với WPF WinForm MFC EXE, phần lớn dữ liệu WAV và GIS âm thanh của nó. – Robert

+0

@Robert, cảm ơn cho đầu vào. Lý tưởng nhất là tôi muốn dính w DX9 tương thích với XP nhưng vì vậy tôi không thể tìm ra không để vẽ các đường dày tùy ý với D3D theo cách có thể so sánh được với các đường dẫn bí danh mà tôi đã đạt được với WPF. Bất kỳ con trỏ? Bạn có phải viết thói quen tesselation của riêng bạn? Tôi thậm chí sẽ được ok với DX10 nếu tôi có thể có được những gì tôi muốn hiệu suất/chất lượng khôn ngoan. –

+0

Đường dày là hạn chế lớn nhất với D3D. Mặc dù nó không phải là một việc lớn. Nếu bạn có thể thiết kế xung quanh kích thước biểu đồ đã biết, thì logic bộ đệm đỉnh sẽ biết kích thước và một vấn đề đơn giản là vẽ đường thẳng làm tứ giác (hình tam giác kép) b) nếu bạn không muốn xây dựng lại bộ đệm đỉnh dựa trên kích thước sự kiện, sau đó đổ bóng nên được thiết kế để giữ tỷ lệ khung hình và kích thước vật lý trong một bộ đệm liên tục, sau đó dữ liệu này được sử dụng trong bóng đổ đỉnh để chỉnh quads dòng của bạn trên bay. Đây là trường hợp của dx9/11. Hoặc bạn có thể sử dụng D2D và logic giảm dữ liệu để vẽ số lượng lớn. – Robert

Trả lời

1

Chế độ hiển thị lại của WPF giúp vẽ/vẽ lại biểu đồ và hình ảnh tùy chỉnh khéo léo để thực hiện, đặc biệt khi các bản vẽ đó chứa nhiều đối tượng.

Bản vẽ nhanh nhất mà tôi có thể thực hiện trong WPF là sử dụng WritableBitmap và điền nó với một cuộc gọi tới WritePixels, đây có thể là một tùy chọn cho bạn. Nó vượt quá tốc độ vẽ của biểu đồ tôi đã viết bằng PathGeometries và vẽ lên Canvas.

Tôi quan tâm để xem liệu có mặt đất trung bình nhanh hơn hay không.

+0

Một 'nền tảng trung bình' có thể là vẽ nó lên một RenderContext trong ghi đè OnRender. Nếu không có gì khác, điều này mang lại cảm giác nhẹ nhõm về tinh thần vì nó cảm thấy giống như việc vẽ tranh GDI/WinForms ... (nghiêm túc hơn, nó sẽ cho phép truy cập vào các phần tử dựng hình phong nha mà không cần phải xây dựng cây chế độ được giữ lại. thường chỉ là sự lặp lại dự phòng của đồ thị đối tượng riêng) –

+0

Tôi sợ OnRender vẫn sử dụng đường ống chế độ được giữ lại. Tất cả những gì bạn đang làm là đăng các đối tượng chế độ được giữ lại vào đường ống đồ họa bằng cách sử dụng nó. Để kiểm tra nó, hãy đặt một điểm ngắt bên trong và thu nhỏ/tối đa hóa cửa sổ của bạn.Nếu đây là phương thức chế độ tức thì (ví dụ: OnPaint trong Winforms), Bạn sẽ buộc vẽ lại. Tôi không chắc chắn 100% nhưng tôi nghĩ rằng thay đổi kích thước cũng sẽ không khiến OnRender kích hoạt trừ khi bạn đặt cờ này làm cờ. –

1

Tiết lộ: Tôi sở hữu phần mềm ABT và đã phát triển SciChart, cộng thêm đã đóng góp vào việc thư viện mã nguồn mở WriteableBitmapEx

Đáng tiếc là bạn không thiếu bất cứ điều gì. Công cụ hiển thị chế độ được giữ lại trong WPF/Silverlight mang lại hiệu năng kém cho loại công việc này. Tôi đã làm việc trên một số hệ thống đã được nâng cấp từ Windows Forms lên WPF, nơi khách hàng đã vô cùng thất vọng bởi hiệu suất kết xuất của khung "GPU Accelerated" này!

Dù sao, có một cách. Sử dụng hiển thị chế độ ngay lập tức. Xem các lớp WriteableBitmap hoặc InteropBitmap. Có một thư viện nguồn mở tuyệt vời được gọi là WriteableBitmapEx bởi Rene Schulte mà tôi đã đóng góp. WriteableBitmapEx cung cấp một số hàm vẽ mức thấp (kiểu GDI) để vẽ trực tiếp tới bitmap. Điều này mang lại hiệu suất tuyệt vời và dấu chân bộ nhớ thấp (có khung ưa thích của MS bị đánh bại bởi một vài cũng được tối ưu hóa cho vòng lặp và con trỏ đến mảng byte).

Nếu đó là thành phần biểu đồ bên thứ ba cụ thể mà bạn đang tìm kiếm, hãy thử SciChart. SciChart là một thành phần tôi đã phát triển bản thân mình mà tìm cách lấp đầy khoảng trống cho hiệu suất cực cao WPF hoặc Silverlight khoa học/biểu đồ chứng khoán. Nó sử dụng các thuật toán resampling độc quyền để giảm số liệu trước khi vẽ, hiển thị chế độ ngay lập tức và một loạt các tối ưu khác như phối hợp đối tượng và sử dụng lại tài nguyên, dẫn đến tốc độ làm tươi mượt cho bộ dữ liệu rất lớn và dung lượng bộ nhớ thấp.

Nhấp vào bản trình diễn hiệu suất trên liên kết ở trên (yêu cầu Silverlight 4). Hiện tại SciChart có thể hiển thị 1.000.000 datapoints vào khoảng 5FPS (tùy thuộc vào phần cứng đích), tương đương với 5.000.000 datapoints mỗi giây. Giấy phép thương mại sẽ có sẵn trong quý 1 năm 2012.

+0

@DrABT - ngoài sự tò mò, WritableBitmapEx có hỗ trợ tùy ý chống răng cưa như độ dày hoặc bạn có phải thực hiện điều đó một cách riêng biệt trong thành phần SciChart không? –

+0

Xin chào Miky, WBEX không hỗ trợ điều này theo như tôi biết. Chúng tôi đã thực hiện nó với một vài thuật toán khác nhau để có được sự cân bằng giữa chất lượng và tốc độ. Một thuật toán đơn giản được thảo luận trên các diễn đàn WBEX nơi bạn đặt trước một hình elip có kích thước N và ghi nó ở mọi điểm trong dòng bresenham. Đáng ngạc nhiên là công trình này nhưng sẽ dẫn đến các cạnh lởm chởm như WBEX có các tọa độ nguyên. Để có được một đường thẳng thực sự mượt mà, bạn cần điểm nổi - cũng đắt về CPU! Trình kết xuất chất lượng cao SciChart thực hiện điều này cũng như trình kết xuất D3D thử nghiệm. –

+0

@DrABT cảm ơn bạn đã phản hồi nhanh. Tôi không chủ động làm việc này vào thời điểm này nhưng có lẽ tôi sẽ xem xét lại việc thực hiện của chúng tôi tại một số điểm. –

1

Kết quả tốt nhất có thể đạt được bằng lập trình DirectX mức thấp và sử dụng trình đổ bóng HLSL. Việc hiển thị dựa trên không gian tên System.Windows.Media phải được quên ngay lập tức khi nhu cầu hiệu suất tối đa và thời gian thực là quan trọng.

Chúng tôi có thể phát triển các thói quen có thể vẽ trên 1000 triệu điểm dữ liệu, ví dụ: 8 dữ liệu cấp dữ liệu x 125 M điểm dữ liệu, sử dụng đường rộng, không có downsampling. Các thói quen là một phần của các biểu đồ LightningChart, WPF (và biểu đồ WinForms). Phải mất 7 năm để chúng tôi có được đến thời điểm này ... Chúng tôi đã thực hiện một billion points example, với dự án VS và Youtube video bao gồm.

[Tôi là người lãnh đạo công nghệ của LightningChart]

+0

Hi Pasi - cảm ơn câu trả lời của bạn; LightningChart là nguồn mở? nếu không, bạn có muốn chia sẻ thêm một số chi tiết về loại DirectX nguyên thủy và shader cấp thấp mà bạn đang sử dụng không? bạn đang sử dụng Direct2D hoặc Direct3D? Và bạn đang sử dụng trình đổ bóng cho mục đích gì? –

+0

Xin chào Mike, LightningChart không phải là nguồn mở. Chúng tôi đang sử dụng Direct3D cũng cho đồ họa 2D. Direct2D là một số chậm và hạn chế. Xin lỗi tôi không thể chia sẻ tất cả các chi tiết ở nơi công khai. Hiệu suất của chúng tôi là kết quả của nhiều năm làm việc, thử nghiệm với các phương pháp tiếp cận khác nhau và nhu cầu thực tế của khách hàng. –

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