Влияние преобразования WPF (Silverlight) (Render) на производительность приложения - PullRequest
5 голосов
/ 27 января 2011

При разработке части пользовательского интерфейса приложения WPF или Silverlight мы можем применить некоторые преобразования отображения (LayoutTransform или RenderTransform) к визуальным элементам.Вот некоторые из этих преобразований:

  • RotateTransform
  • ScaleTransform
  • SkewTransform
  • TranslateTransform

Интересно, к чемунасколько использование таких преобразований замедляет рендеринг страницы?

Чтобы быть более конкретным.Например, у меня есть тысяча простых элементов, скажем, прямоугольников на странице, которые помещаются в строки с использованием Grid и некоторых StackPanels.Если я применю RotateTransform ко всем или некоторым из них, окажет ли это заметное влияние на производительность моего приложения?

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

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

LayoutTranform вызовет полный проход в системе макета.Это приведет к переоценке и перестановке всех объектов на экране.Это математически интенсивная операция, пропорциональная количеству объектов на экране.

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

1 голос
/ 29 января 2011

Вот прототип, который вы можете использовать для экспериментов с различными опциями:

<Grid>
    <Grid.Resources>
        <local:Range x:Key="sampleData" Minimum="1" Maximum="900"/>
    </Grid.Resources>
    <ItemsControl ItemsSource="{StaticResource sampleData}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="30" Columns="30"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" FontSize="8">
                    <TextBlock.LayoutTransform>
                        <RotateTransform Angle="30"/>
                    </TextBlock.LayoutTransform>
                </TextBlock>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

и генератор данных:

class Range : List<int>, ISupportInitialize
{
    public int Minimum { get; set; }
    public int Maximum { get; set; }

    public void BeginInit() { }

    public void EndInit()
    {
        for (int i = Minimum; i <= Maximum; i++) Add(i);
    }
}

, а верхний левый угол выглядит следующим образом:

transform performance

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

...