0

渲染/旋转 WPF 三角形时出现性能问题

如果我显示了一个 WPF 三角形并且它将围绕中心点旋转一定程度,我可以通过以下两种方式之一进行:

  1. 以编程方式确定后端中的点及其偏移量,使用 XAML 将它们简单地放置在它们所属的画布上,如下所示:

    <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. 每次都生成“相同”的三角形,然后使用 RenderTransform (Rotate) 将其放在它所属的位置。在这种情况下,旋转计算被混淆了,因为我无法访问它们是如何完成的。

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

我的问题是哪个更快?

我知道我应该自己测试它,但是我如何测量具有这种粒度的对象的渲染时间。我需要能够计算表单的实际渲染时间有多长,但由于我不是开始重绘的人,所以我不知道如何捕获开始时间。

4

2 回答 2

0

您可以像这样覆盖表单的 OnPaint 方法(伪代码):

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

    base.OnPaint(...);

    // Stop timer
 }

还是我太天真了?

于 2009-08-26T19:59:47.500 回答
0

您是否尝试过使用WPF 性能工具中包含的 Perforator 或 Visual Profiler ?从文档看来,这些工具应该能够为您提供您正在寻找的信息。您必须以第一种方式构建应用程序,使用这些工具对其进行测试,记下性能信息,然后使用第二种方式构建的应用程序重新进行比较。

于 2009-05-06T20:54:56.030 回答