绘画.图形,性能差



我目前正在开发一个使用绘图的c#应用程序。图形绘制到位图,我显示在一个图片框。我正在渲染一个带有网格的图形,所以除了屏幕上的一些点之外,我还必须绘制大约200条网格线。我可以滚动来移动图形,但在这样做的时候,我注意到我的绘图功能表现不佳,因为它断断续续。用OpenTK和它的GLControl类代替这种方法可以使渲染非常高效,滚动非常平滑。

有没有办法从绘图中获得更快的性能?

  // This is only done when the window is resized
  Bitmap bmp = new Bitmap(picRender.Width, picRender.Height);
  Graphics g = Graphics.FromImage(bmp);
  // Drawing code
  g.Clear(picRender.BackColor);
  g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
  g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
  if (background != null)
  {
   g.DrawImage(background, new Rectangle(0, 0, picRender.Width, picRender.Height));
  }
  for (int n = 0; n < trajectories.Count; n++)
  {
   Trajectory trajectory = trajectories[n];
   Pen pen = new Pen(new SolidBrush(TrajectoryColors[n % TrajectoryColors.Length]));
   if (RenderLines)
   {
    for (int i = 0; i < trajectory.samples.Count - 1; i++)
    {
        if (Interval_Start > trajectory.samples[i + 1].time ||
         Interval_End < trajectory.samples[i].time) { continue; }
        g.DrawLine(pen, coordinate_system.ToPoint(trajectory.samples[i].coordinates),
         coordinate_system.ToPoint(trajectory.samples[i + 1].coordinates));
    }
   }
  }
  // End of drawing

除了优化绘图代码,另一个可以使用的策略是缓冲结果。

通过每次重新绘制整个图像,但只更新刚刚滚动到视图(或更好:即将滚动到视图)的部分

如果你需要更多的信息,我们需要看到一些代码来帮助你的配置文件

可以通过设置Graphics.SmoothingMode属性为SmoothingMode.None来关闭抗锯齿

OpenGL和System。图形(GDI+)使用不同种类的"绘图"。

OpenGL使用显卡,因此重画是快速和廉价的。系统。WindowsForms中的图形使用GDI+,它由CPU执行,因此与GPU相比非常慢。

使用GDI+有很多方法可以加快渲染速度。一种是改变代码,只重新绘制已经改变/移位的部分。剩下的就留着吧

为每一帧轨迹创建一个新笔刷和一支新笔:

Pen pen = new Pen(new SolidBrush(TrajectoryColors[n % TrajectoryColors.Length]));

Pen(当然)和SolidBrush(最终)实现IDisposable -它们应该被显式地处理,如果可能的话,它们不应该生活在高渲染循环中。如果需要动态着色,可以缓存笔。

没有测量时间,我怀疑这可以改善你的渲染。GDI渲染通常非常快(与WPF矢量图形相反),200行不算什么。抗锯齿性能可能取决于你的GPU驱动程序。它看起来太棒了,你无法关闭它。

最新更新