WPF PathGeometry / RotateTransform оптимизация - PullRequest
0 голосов
/ 05 мая 2009

У меня проблемы с производительностью при рендеринге / повороте треугольников 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>
    

У меня вопрос, какой из них быстрее?

Я знаю, что должен сам проверить это, но как мне измерить время рендеринга объектов с такой детализацией. Мне нужно было бы рассчитать, сколько времени фактическое время рендеринга для формы, но, поскольку я не тот, кто запускает перерисовку, я не знаю, как зафиксировать время начала.

Ответы [ 2 ]

0 голосов
/ 26 августа 2009

Вы можете переопределить метод OnPaint формы следующим образом (псевдокод):

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

    base.OnPaint(...);

    // Stop timer
 }

или я невероятно наивен?

0 голосов
/ 07 мая 2009

Пробовали ли вы использовать Перфоратор или Визуальный Профилировщик, включенные в WPF Performance Tools ? Из документации видно, что эти инструменты должны быть в состоянии предоставить вам информацию, которую вы ищете. Вам нужно будет создать свое приложение первым способом, протестировать его с помощью этих инструментов, принять к сведению информацию о производительности, а затем повторить все заново с приложением, созданным для сравнения вторым способом.

...