Рисование. Графика, плохая работа - PullRequest
4 голосов
/ 17 апреля 2011

В настоящее время я работаю над приложением C #, которое использует Drawing.Graphics для рисования в растровом изображении, которое я отображаю в графическом окне.Я рендерил график с сеткой, поэтому мне нужно нарисовать около 200 линий сетки в дополнение к количеству точек на экране.Я могу прокручивать, чтобы перемещаться по графику, но при этом я замечаю, что моя функция рисования имеет низкую производительность, поскольку она заикается.Замена этого подхода на OpenTK и его класс GLControl делает рендеринг настолько эффективным, что прокрутка становится очень плавной.

Есть ли способ получить более высокую производительность из Drawing.Graphics?

  // 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

Ответы [ 3 ]

0 голосов
/ 17 апреля 2011

Вы можете отключить сглаживание, установив для свойства Graphics.SmoothingMode значение SmoothingMode.None.

0 голосов
/ 17 апреля 2011

OpenGL и System.Graphics (GDI +) используют различные виды «рисования».

OpenGL использует графическую карту, поэтому перерисовка выполняется быстро и дешево.System.Graphics в WindowsForms использует GDI +, который выполняется процессором, поэтому он довольно медленный по сравнению с графическим процессором.

Существует множество способов ускорить рендеринг с использованием GDI +.Одним из них является изменение кода, чтобы перерисовать только часть, которая изменилась / сместилась.Но остальное оставь.

0 голосов
/ 17 апреля 2011

Наряду с оптимизацией кода чертежа еще одна тактика, которую можно использовать, заключается в буферизации результатов.

По не перерисовывает все изображение каждый раз, но обновляет только те части, которые только что прокручивались впросмотр (или лучше: вот-вот перейдет к просмотру)

Если вам нужна дополнительная информация, нам нужен код, который поможет вам в профиле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...