xuyunhai20160827 Ответов: 0

Вопрос об эффективности GDI+.


I met a question about the efficiency of GDI+.
There are several variables and methods
 as below:
1.points, such as A(Represents a coordinate point, such as X Y Z), B, C, D, E, etc.

2 List named Cmd1, used to add points by thread

3.paint method, in this method, the set of points connected to the line

4.thread for the constant addition of new points,such as F,G,H,I,J etc.

In Paint Method,i use g.DrawLine() to link a and b,c,d,e.
In thread,when i add new points,i will call invalid to refresh component.
so my question is,points become more and more, how can I maintain high efficiency, and redraw, 

do not start from the a point to re - drawline.


Что я уже пробовал:

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, чтобы добавить точки a,b,c,d,e, и использовать недопустимый метод для обновления, когда я вызываю invalid, "для каждого cmd как Cmd1 в Cmd1s" для каждого будет начинаться с точки,поэтому, когда точек становится все больше и больше, как я могу поддерживать высокую эффективность и перерисовывать, не начинайте с точки, чтобы заново нарисовать линию

Richard MacCutchan

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

xuyunhai20160827

Можете ли вы привести мне пример, эта проблема беспокоит меня уже давно

Richard MacCutchan

Извините, у меня нет примера. Вот почему я сказал: "тебе нужно...".

xuyunhai20160827

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

Richard MacCutchan

Идти к Использование GDI+ (Windows)[^], и Прямоугольники (Окна)[^] для получения информации об использовании областей внутри окна.

xuyunhai20160827

забавный

Richard MacCutchan

:/

0 Ответов