2009-05-05 10 views
0

I Performance-Probleme haben beim Rendern/Dreh WPFWPF PathGeometry/RotateTransform Optimierung

Dreiecken Wenn ich ein WPF-Dreieck angezeigt wird, hatte, und es wird um eine Mittelpunkt zu einem gewissen Grad gedreht wird, kann ich es eines von zwei tun Wege:

  1. Programatically die Punkte bestimmen und ihre im Backend-Offset verwenden XAML einfach sie auf der Leinwand zu platzieren, wo sie hingehören, würde es so aussehen:

    <Path Stroke="Black"> 
        <Path.Data> 
         <PathGeometry> 
         <PathFigure StartPoint ="{Binding CalculatedPointA, Mode=OneWay}"> 
          <LineSegment Point="{Binding CalculatedPointB, Mode=OneWay}" /> 
          <LineSegment Point="{Binding CalculatedPointC, Mode=OneWay}" /> 
          <LineSegment Point="{Binding CalculatedPointA, Mode=OneWay}" /> 
         </PathFigure> 
         </PathGeometry> 
        </Path.Data> 
    </Path> 
    
  2. Erzeugen Sie jedes Mal das gleiche Dreieck und verwenden Sie dann eine RenderTransform (Rotate), um es dorthin zu bringen, wo es hingehört. In diesem Fall werden die Rotationsberechnungen verschleiert, da ich keinen Zugriff darauf habe, wie sie ausgeführt werden.

    <Path Stroke="Black"> 
        <Path.Data> 
         <PathGeometry> 
         <PathFigure StartPoint ="{Binding TriPointA, Mode=OneWay}"> 
          <LineSegment Point="{Binding TriPointB, Mode=OneWay}" /> 
          <LineSegment Point="{Binding TriPointC, Mode=OneWay}" /> 
          <LineSegment Point="{Binding TriPointA, Mode=OneWay}" /> 
         </PathFigure> 
         </PathGeometry> 
        </Path.Data> 
        <Path.RenderTransform> 
         <RotateTransform CenterX="{Binding Centre.X, Mode=OneWay}" 
             CenterY="{Binding Centre.Y, Mode=OneWay}" 
             Angle="{Binding Orientation, Mode=OneWay}" /> 
        </Path.RenderTransform> 
    </Path> 
    

Meine Frage ist, welche schneller ist?

Ich weiß, ich sollte es selbst testen, aber wie messe ich die Renderzeit von Objekten mit einer solchen Granularität. Ich müsste in der Lage sein zu zählen, wie lange die tatsächliche Rendering-Zeit für das Formular ist, aber da ich nicht derjenige bin, der den Neuaufbau startet, kann ich die Startzeit nicht erfassen.

Antwort

0

Haben Sie versucht, entweder den Perforator oder den Visual Profiler zu verwenden, der in der WPF performance tools enthalten ist? Aus der Dokumentation geht hervor, dass diese Tools Ihnen die gesuchten Informationen liefern können. Sie müssten Ihre Anwendung auf die erste Art und Weise erstellen, sie mit diesen Tools testen, die Leistungsinformationen zur Kenntnis nehmen und dann die Anwendung erneut erstellen, um die zweite Möglichkeit zum Vergleichen zu erhalten.

0

Sie könnten die Form der OnPaint-Methode wie diese (Pseudocode) außer Kraft setzen:

private void OnPaint(...) 
{ 
    // Start timer 

    base.OnPaint(...); 

    // Stop timer 
} 

oder Bin ich unglaublich naiv?