2 つのバージョンの線描画コードを実装しました。1 つは WPF 図形 (線) を使用し、もう 1 つは StreamGeometry と DrawingVisual を使用します。
DrawingVisual の方が高速である必要がありますが、正反対のことがわかりました。DrawingVisual オブジェクトを含むホスト ウィンドウの最初の描画とその後のサイズ変更は、WPF の行の例よりもはるかに遅く、ぎくしゃくしています。
私は何を間違っていますか?
WPF 行コード:
Dim Rand As New Random
For i As Integer = 1 To 1000
Dim Line As New Line
Line.X1 = Rand.NextDouble * 500
Line.X2 = Rand.NextDouble * 500
Line.Y1 = Rand.NextDouble * 500
Line.Y2 = Rand.NextDouble * 500
Line.Stroke = Brushes.Black
Line.StrokeThickness = 0.25
BaseGrid.Children.Add(Line)
Next
DrawingVisual コード:
描画ビジュアル ホスト コントロール:
Public Class VisualHost
Inherits FrameworkElement
Dim Visual As New DrawingVisual()
Dim Context As DrawingContext
Dim Pen As Pen
Dim rand As New Random
Public Sub New()
Pen = New Pen(Brushes.Black, 0.25)
Pen.Freeze()
AddVisualChild(Visual)
End Sub
Public Sub Draw()
Dim Geometry As New StreamGeometry()
Using GeometryContext As StreamGeometryContext = Geometry.Open()
GeometryContext.BeginFigure(New Point(rand.NextDouble * 500, rand.NextDouble * 500), False, False)
For i As Integer = 1 To 1000
GeometryContext.LineTo(New Point(rand.NextDouble * 500, rand.NextDouble * 500), True, True)
Next
End Using
Geometry.Freeze()
Using Context = Visual.RenderOpen()
Context.DrawGeometry(Nothing, Pen, Geometry)
End Using
End Sub
Protected Overrides ReadOnly Property VisualChildrenCount() As Integer
Get
Return 1
End Get
End Property
Protected Overrides Function GetVisualChild(index As Integer) As Visual
Return Visual
End Function
End Class
VisualHost をグリッドに割り当てる:
Private Host As New VisualHost
BaseGrid.Children.Add(Host)
Host.Draw()