2013-03-20 48 views
0

我有16个图[最大值],每个图中有4条快速线。在每幅图中,3条快速线表示最小值,最大值和理想值。第四条fastline是来自硬件的实际值。我必须运行18,000个样本的测试。因此,前3条快速线已经绘制好,当开关打开并且数据进入时,将绘制第4条快速线。为了绘制第四行,我使用方法Series4.Add(actualvalue,“”,color.red)。 这里是问题所在。每次在第4行绘制样本。图表必须刷新才能查看该样本的绘图。还重绘了其他3条快速线,每条18000个样本。所以它重绘了很多样本​​而没有再次使用。我只需要画第四条快速线。 我不能使用数组来填充值,然后将其分配为fastline的源,因为我事先没有任何值。我尝试了series4.repaint()方法和series4.refreshseries()方法,但实际上并没有重绘第4个系列。我们必须刷新整个图表。因此,由于每条快速线[18,000]中有大量样本,并且有4条快速线和总共16个这样的图,因此它会降低性能。我已经完成 Series4.AutoRepaint = false,Series4.DrawAllPoints = false; Series4.XValues.Order = ValueListOrder.None,Series4.YValues.Order = ValueListOrder.None如何提高tchart refresh()的速度?

有没有什么办法可以提高性能? 谢谢。

回答

2

我做了一个简单的代码,其中我用4个FastLines添加了4个图表,每个fastline使用18000个点,使用表添加一个初始化值,并在更新了Series4的值之后。性能对于我正在绘制的数值有好处:

 public Form1() 
    { 
     InitializeComponent(); 
     InitializeChart(); 
    } 

    // Steema.TeeChart.Styles.FastLine Series1; 

    Timer timer1, timer2,timer3, timer4; 
    Random r; 
    DateTime dt; 
    DateTime[] Xvalues1; 
    double[] Yvalues1; 
    Steema.TeeChart.TChart tChart1, tChart2, tChart3,tChart4; 
    private void InitializeChart() 
    { 

     tChart1 = new TChart(); 
     tChart2 = new TChart(); 
     tChart3 = new TChart(); 
     tChart4 = new TChart(); 
     this.Controls.Add(tChart1); 
     this.Controls.Add(tChart2); 
     this.Controls.Add(tChart3); 
     this.Controls.Add(tChart4); 

     //Initialize Locations and size 

     this.Width = 908; 
     this.Height = 600; 

     //Location 
     tChart1.Left = 12; 
     tChart1.Top = 53; 
     tChart2.Left = 468; 
     tChart2.Top = 53; 
     tChart3.Left = 12; 
     tChart3.Top = 318; 
     tChart4.Left = 468; 
     tChart4.Top = 318; 

     //Size 
     tChart1.Width = 373; 
     tChart1.Height = 236; 
     tChart2.Width = 373; 
     tChart2.Height = 236; 
     tChart3.Width = 373; 
     tChart3.Height = 236; 
     tChart4.Width = 373; 
     tChart4.Height = 236;  

     tChart1.Aspect.View3D = false; 
     tChart2.Aspect.View3D = false; 
     tChart3.Aspect.View3D = false; 
     tChart4.Aspect.View3D = false; 

     tChart1.Legend.Visible = false; 
     tChart2.Legend.Visible = false; 
     tChart3.Legend.Visible = false; 
     tChart4.Legend.Visible = false; 


     tChart1.Panel.Gradient.Visible = false; 
     tChart2.Panel.Gradient.Visible = false; 
     tChart3.Panel.Gradient.Visible = false; 
     tChart4.Panel.Gradient.Visible = false; 


     tChart1.Axes.Bottom.AxisPen.Visible = false; 
     tChart2.Axes.Bottom.AxisPen.Visible = false; 
     tChart3.Axes.Bottom.AxisPen.Visible = false; 
     tChart4.Axes.Bottom.AxisPen.Visible = false; 

     tChart1.Axes.Left.AxisPen.Visible = false; 
     tChart2.Axes.Left.AxisPen.Visible = false; 
     tChart3.Axes.Left.AxisPen.Visible = false; 
     tChart4.Axes.Left.AxisPen.Visible = false; 

     //Series 
     tChart1.AutoRepaint = false; 
     tChart2.AutoRepaint = false; 
     tChart3.AutoRepaint = false; 
     tChart4.AutoRepaint = false; 

     for (int i = 0; i < 4; i++) 
     { 
      new Steema.TeeChart.Styles.FastLine(tChart1.Chart); 
      new Steema.TeeChart.Styles.FastLine(tChart2.Chart); 
      new Steema.TeeChart.Styles.FastLine(tChart3.Chart); 
      new Steema.TeeChart.Styles.FastLine(tChart4.Chart); 

      tChart1[i].XValues.DateTime=true; 
      tChart2[i].XValues.DateTime = true; 
      tChart3[i].XValues.DateTime = true; 
      tChart4[i].XValues.DateTime = true; 
      InitialDataSeries(tChart1[i]); 
      InitialDataSeries(tChart2[i]); 
      InitialDataSeries(tChart3[i]); 
      InitialDataSeries(tChart4[i]); 

     } 

     //Axes labels 
     tChart1.Axes.Bottom.Labels.DateTimeFormat = "dd/MM"; 
     tChart1.Axes.Bottom.Labels.Angle = 90; 
     tChart2.Axes.Bottom.Labels.DateTimeFormat = "dd/MM"; 
     tChart2.Axes.Bottom.Labels.Angle = 90; 
     tChart3.Axes.Bottom.Labels.DateTimeFormat = "dd/MM"; 
     tChart3.Axes.Bottom.Labels.Angle = 90; 
     tChart4.Axes.Bottom.Labels.DateTimeFormat = "dd/MM"; 
     tChart4.Axes.Bottom.Labels.Angle = 90; 
     tChart1.AutoRepaint = true; 
     tChart2.AutoRepaint = true; 
     tChart3.AutoRepaint = true; 
     tChart4.AutoRepaint = true; 
     tChart1.Refresh(); 
     tChart2.Refresh(); 
     tChart3.Refresh(); 
     tChart4.Refresh(); 

     //Timer 
     timer1 = new Timer(); 
     timer1.Start(); 
     timer1.Interval = 100; 
     timer1.Tick += new EventHandler(timer1_Tick); 

    } 

    void timer1_Tick(object sender, EventArgs e) 
    { 
     //See the chart data updated. 
     tChart1[0].Visible = false; 
     tChart1[1].Visible = false; 
     tChart1[2].Visible = false; 
     PopulateSeries(tChart1[3]); 
     PopulateSeries(tChart2[3]); 
     PopulateSeries(tChart3[3]); 
     PopulateSeries(tChart4[3]); 

    } 
    private void PopulateSeries(Steema.TeeChart.Styles.Series Series1) 
    { 
     r = new Random(); 
     dt = DateTime.Now; 
     tChart1.AutoRepaint = false; 
     tChart2.AutoRepaint = false; 
     tChart3.AutoRepaint = false; 
     tChart4.AutoRepaint = false; 
     // show only 50 points - delete the rest 
     while (Series1.Count > 10000) 
     { 
      Series1.Delete(0); 

     } 
     if (Series1.Count > 10000) 
     { 
      Series1.Delete(0); 

     } 
     else 
     { 
      for (int t = 0; t < 100; t++) 
      { 

       Series1.Add(dt, r.Next(1000)); 
       dt = dt.AddSeconds(15); 
      } 
     } 
     tChart1.AutoRepaint = true; 
     tChart2.AutoRepaint = true; 
     tChart3.AutoRepaint = true; 
     tChart4.AutoRepaint = true; 
     tChart1.Refresh(); 
     tChart2.Refresh(); 
     tChart3.Refresh(); 
     tChart4.Refresh(); 
    } 

    private void InitialDataSeries(Steema.TeeChart.Styles.Series Series1) 
    {  
     //Arrays 
     dt = DateTime.Now; 
     r = new Random(); 
     Xvalues1 = new DateTime[18000]; 
     Yvalues1 = new double[18000]; 
     (Series1 as Steema.TeeChart.Styles.FastLine).DrawAllPoints = false; 
     for (int j = 0; j < 18000; j++) 
     { 
      Xvalues1[j] = dt; 
      dt = dt.AddSeconds(15); 
      Yvalues1[j] = r.Next(1000); 
     } 

     Series1.Add(Xvalues1, Yvalues1); 
    } 

您能告诉我们它是否对您有帮助吗?另一方面,如果我的代码无法帮助您,我建议您使用TeeChartDirect2D,这对于DSP实时应用程序所需的高速数据吞吐量来说非常理想。请参阅白皮书Boosting graphics-rendering performance in Windows Forms,以获得更详细的信息。

谢谢,

+0

谢谢,但我不能让其他3行看不见。我希望能够以最小最大值和理想范围实时查看第四条线的位置。所以在使它们看不见之后,它以极佳的速度绘制。但我不能隐藏其他3行。所以,我不能做fastline.visible = false和fastline.active = false。令人惊讶的活跃也隐藏了快速线。所以看起来像主动和可见服务于相同的目的。有没有办法可以使用fastline.draw(),fastline.repaint(),fastline.refreshseries()更新第4行? – 2013-03-21 04:52:03

+0

我也尝试下载direct2d演示。 graphicscontrol.dll缺少winforms应用程序。搜索了zip文件,但没有像那样的dll文件,也就是说Matrix3x2不存在。 – 2013-03-21 05:28:40

+0

也是private void PopulateSeries(Steema.TeeChart.Styles.Series Series1)和private void InitialDataSeries(Steema.TeeChart.Styles.Series Series1)。不应该是Steema.TeeChart.Styles.Fastline,而不是Steema.TeeChart.Styles.Series – 2013-03-21 05:48:16