2009-07-19 34 views
21

Tôi đang viết WPF mã để hiển thị ô theo thời gian thực là đường được kết nối có chứa khoảng 10.000 điểm. Mất khoảng 5 giây để hiển thị ảnh trong máy tính của tôi. Có ai có ý tưởng để làm cho nó nhanh hơn và trong vòng 0,5 giây?Làm thế nào để vẽ đường mười nghìn điểm với WPF trong vòng 0,5 giây?

class eee : FrameworkElement 
{ 

    public eee() 
    { 
     _children = new VisualCollection(this); 
     Random rand = new Random(); 
     DrawingVisual dv = new DrawingVisual(); 
     using (DrawingContext dx = dv.RenderOpen()) 
     { 
      Pen drawingPen = new Pen(Brushes.Black, 1); 
      double x=rand.Next(300); 
      double y = rand.Next(300); 
      for (double i = 0; i < 1000; i = i + 0.1) 
      { 
       y = 100 + rand.Next(100); 
       dx.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y)); 
       x = y; 
      } 
     } 
     _children.Add(dv); 
    } 
+1

Charles chỉ là điểm, nếu bạn cần các dòng, sử dụng cùng một phương pháp, nó sẽ hoạt động tốt. YOu phải tận dụng hệ thống đồ họa được giữ lại. – RandomNickName42

Trả lời

39

Charles Petzold thực hiện chính xác điều đó. Nó thậm chí còn nhanh hơn trên máy chủ của tôi (< 0,3 giây), và điểm thậm chí còn là DataBound !! ;)

Tamir Khason cũng thực hiện điều này, với các dòng và đi sâu hơn về hiệu suất kiểu bitmap WPF here.

Rico Mariani có một số hướng dẫn về đồ họa hiệu suất cao 3D, về cơ bản tận dụng các loại giá trị có thể cải thiện thông lượng của bạn nếu suy nghĩ tốt.

Jianzhong Zhang cung cấp hướng dẫn mới về chủ đề này, âm mưu phân tán 3D hàng chục nghìn điểm dữ liệu hoạt ảnh và tương tác.

1

Các dòng có nên chọn không? Bạn có thể vẽ các đường trong hình ảnh, sau đó cung cấp cho nó như là một nguồn để kiểm soát hình ảnh. Nó sẽ vẽ nhanh hơn nhưng bạn sẽ mất khả năng tương tác với các dòng.

0

Bạn đã xem XNA chưa? Sử dụng một card đồ họa sẽ tăng tốc độ.

+2

WPF cũng sử dụng tăng tốc phần cứng. –

+3

Đối với bất cứ ai đọc điều này, XNA hiện đang bị ngưng. – Nuzzolilo

2

Tôi đoán mẫu mã là 1) thử nghiệm để thử một thứ không thực sự là mẫu hoặc 2) bài tập về nhà.

Cố gắng ghi đè OnRender và làm điều gì đó như:

Pen drawingPen = new Pen(Brushes.Black, 1); 

protected override void OnRender(DrawingContext dc) 
{ 
    dc.DrawRectangle(Background, null, new Rect(RenderSize)); 


      double x=rand.Next(300); 
      double y = rand.Next(300); 
      for (double i = 0; i < 1000; i = i + 0.1) 
      { 
       y = 100 + rand.Next(100); 
       dc.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y)); 
       x = y; 
      } 


} 

hoặc một cái gì đó với dữ liệu thực tế, xem xét nếu bạn thực sự cần phải hiển thị tất cả các điểm tùy thuộc vào độ phân giải của bối cảnh thị giác. (Nếu tỷ lệ của bạn là 0-10 và bạn đang tạo ra các điểm 0.0001,0.00015 thì chúng thực sự khác nhau về quy mô của bạn)

+0

DrawRectangle có thể không cần thiết vì các nội dung được (trong trường hợp của tôi) được xóa trên mỗi kết xuất. – Nuzzolilo

0

Monogame, dựa trên XNA, vẫn còn hoạt động. Bạn có thể sử dụng sức mạnh của nó để giải quyết một số nhiệm vụ đặc biệt đòi hỏi hiệu suất đồ họa lớn và thậm chí là tiêm các cửa sổ của nó trong WPF GUI.

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