2016-12-27 6 views
-1

У меня возник вопрос об эффективности GDI +. Есть несколько переменных и методов , как показано ниже: 1.Points, такие как A (Представляет точку координат, например, XYZ), B, C, D, E и т.д.update move mouse

2 Список имени CMD1, используемого для добавления точек с помощью резьбы

метода 3.Paint, в этом методе, множество точек, подключенных к линии

4.Thread для постоянного добавления новых точек, таких как F, G, H, I , J и т. Д.

В методе Paint я использую g.DrawLine() для ссылки a и b, c, d, e. В потоке, когда я добавляю новые точки, я вызову invalid для обновления компонента. , так что мой вопрос, точки становятся все больше и больше, как я могу поддерживать высокую эффективность и перерисовывать,

не начинайте с точки на повторную линию.

Sub DrawGLines2(g As Graphics) 

    g.SmoothingMode = SmoothingMode.HighSpeed 
    Dim Pen As New Pen(Brushes.White) 
    Dim i As Int32 
    'Dim c As Int32 
    Dim preCmd1 As Cmd1 
    Try 
     For Each cmd As Cmd1 In Cmd1s    
       Dim pfs() As PointF = cmd.PointFs.ToArray 
       If preCmd1 IsNot Nothing Then 
        g.DrawLine(Pen, cmd.PointFs(0), preCmd1.PointFs(0)) 
       End If 
       preCmd1 = cmd 
      End If 

     Next 
    Catch ex As Exception 
     Debug.Print(ex.Message) 
    End Try 
End Sub 

Private Sub Sheet_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 
    If Me.Cmd1s.Count>0 Then 
     DrawGLines2(e.Graphics) 
    End If 
End Sub 

Public Sub AddPoint(x As Double, y As Double, z As Double, Optional G As Int32 = -1) 
    Dim cmd1 As DrvSimu.Cmd1 = Nothing 
    If cmd1 Is Nothing Then 
     cmd1 = New DrvSimu.Cmd1 
     Me.Cmd1s.Add(cmd1) 
    End If 

    Dim pf3d As New PointF3D(x, y, z) 
    cmd1.PointF3Ds.Add(pf3d) 

    Me.Invalidate() 

End Sub 

нить будет вызывать AddPoint добавить, B, C, D, E точек, и использовать недопустимый метод для обновления, когда я назвать недействительным, «Для каждого cmd As Cmd1 In Cmd1s» для каждого из них начинается с точки A, поэтому, когда точки становятся все больше и больше, как я могу поддерживать высокую эффективность и перерисовывать, не начинайте с точки A до повторного рисования

ответ

1

Это зависит от того, что вы точно хотите сделать.

Одна из возможностей, которую вы используете в настоящее время. При каждом недействительности вы перерисовываете все строки. В зависимости от качества чертежа и процессора вы можете рисовать больше или меньше строк, но должно быть возможно рисовать не менее 10 строк в мс.

Если вы добавляете только строки, и вам не нужно их удалять или изменять, вы также можете рисовать все строки в растровые изображения и недействительными, вы только рисуете это изображение на экране. При этом вам нужно всего лишь нарисовать новые строки на картинке, когда они будут добавлены. Проблема с этим методом заключается в том, что вам по-прежнему требуется полное перерисовка, если вы хотите масштабировать или панорамировать область или хотите удалить строки.

В качестве отправной точки см. Метод Graphics.FromImage (...). Используйте Pixelformat Format32bppARGB для лучшей производительности.

Edit:

public partial class LineForm : Form 
{ 
    private Bitmap lineBitmap = null; 

    private List<Tuple<PointF,PointF>> lines = new List<Tuple<PointF,PointF>>(); 

    private List<Tuple<PointF,PointF>> newLines = new List<Tuple<PointF,PointF>>(); 

    // must be set if you remove line, pan or zoom the view and if you resize the form. 
    private bool redrawAll = false; 

    public LineForm() 
    { 
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.OnPaint); 
     this.Resize += new System.EventHandler(this.OnResize); 
    } 

    private void OnResize(object sender, EventArgs e) 
    { 
     if (this.lineBitmap!= null) 
     { 
      this.lineBitmap.Dispose(); 
     } 

     if (this.Width <= 0 || this.Height <= 0) 
     { 
      return; 
     } 

     this.lineBitmap = new Bitmap(this.Width, this.Height, PixelFormat.Format32bppPArgb); 
     this.redrawAll = true; 
    } 

    private void OnPaint(object sender, PaintEventArgs e) 
    { 
     Graphics lineGfx = Graphics.FromImage(this.lineBitmap); 
     // Settings for best drawing Performance. Must be adjusted for better quality 
     lineGfx.CompositingQuality = CompositingQuality.HighSpeed; 
     lineGfx.InterpolationMode = InterpolationMode.NearestNeighbor; 
     lineGfx.SmoothingMode = SmoothingMode.None; 
     lineGfx.PixelOffsetMode = PixelOffsetMode.None; 
     lineGfx.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
     lineGfx.CompositingMode = CompositingMode.SourceCopy; 

     // Only clear the Image and draw all lines if necessary 
     if(this.redrawAll) 
     { 
      lineGfx.Clear(Color.Transparent); 
      foreach(Tuple<PointF,PointF> line in this.lines) 
      { 
       lineGfx.DrawLine(Pens.Black, line.Item1, line.Item2); 
      } 
     } 

     // Draw the new Lines to the Bitmap and store them to lines list 
     foreach(Tuple<PointF,PointF> newline in this.newLines) 
     { 
      lineGfx.DrawLine(Pens.Black, newline.Item1, newline.Item2); 
      tihs.lines.Add(newLine); 
     } 

     // Clear the newLines List as the liones are added to the lines List now. 
     this.newLines.Clear(); 

     // Draw the Bitmap to the screen 
     e.Graphics.DrawImageUnscaled(this.lineBitmap,0,0); 
    } 

    private void AddLine(PointF p1, PointF p2) 
    { 
     this.newLines.Add(new Tuple<PointF,PointF>(p1,p2)); 
     // Invalidate the view => OnPaint Event is raised; 
     this.Invalidate(); 
    } 
} 

Примечание: Я не добавил механизм блокировки для операций списка. Чтобы предотвратить внесение изменений в списки при их использовании, вы должны добавить некоторые блокировки.

+0

Вы можете показать некоторые подробности или демонстрацию, чтобы узнать больше. – xuyunhai

+0

Большое спасибо, я прочитаю внимательно. – xuyunhai

+0

Я нашел проблему: Вы считаете, что повышение эффективности связано с использованием растрового изображения, но я думаю, что повышение эффективности зависит от новой перерисовки точек, а не из всех точек. Другими словами, я думаю, что даже если вы этого не сделаете используйте BITMAP, пока единственный способ перерисовать недавно добавленную точку, может ли она повысить эффективность. – xuyunhai