Замедление работы приложения WPF на компьютере с процессором i5

#wpf #performance #itemscontrol

#wpf #Производительность #itemscontrol

Вопрос:

Одно из разработанных приложений в WPF работает очень медленно на ноутбуке с процессором i5. Пользовательский интерфейс содержит несколько пользовательских элементов управления (более 200) в элементах управления вложенными элементами. То же приложение работает с хорошей производительностью на одном из настольных компьютеров.

Ниже приведена подробная конфигурация ноутбука, где он работает очень медленно (50 секунд для отображения пользовательского интерфейса) :

Операционная система: Windows XP Professional (5.1, сборка 2600) с пакетом обновления 3 (2600.xpsp_sp3_gdr.101209-1647) Производитель системы: LENOVO Модель системы: 2537W2K BIOS: версия 1.00 Процессор PARTTBLx: Intel (R) Core (TM) i5 CPU M 520 @ 2.40GHz (4 процессора) Оперативная память: 3060 МБ ОЗУФайл подкачки: используется 784 МБ, доступно 5172 МБ в каталоге Windows: C:WINDOWS Версия DirectX: DirectX 9.0c (4.09.0000.0904) Параметры настройки DX: Не найдены Версия DxDiag: 5.03.2600.5512 32-битный Юникод

Отображение

Название карты: NVIDIA NVS 3100M Производитель: NVIDIA Тип чипа: NVS 3100M Тип ЦАП: встроенный RAMDAC Ключ устройства: Enum PCI VEN_10DE amp; DEV_0A6C amp; SUBSYS_214217AA amp; REV_A2 Память дисплея: 256,0 МБ Текущий режим: 1680 x 1050 (32 бит) (60 Гц) Монитор: Дисплей ThinkPad 1440×900 Максимальное разрешение монитора:1440 900


Ниже приведена подробная конфигурация рабочего стола, где он работает быстро (6 секунд для отображения того же пользовательского интерфейса) :

Операционная система: Windows XP Professional (5.1, сборка 2600) с пакетом обновления 3 (2600.xpsp_sp3_gdr.101209-1647) Производитель системы: Dell Inc. Модель системы: OptiPlex 755
BIOS: Phoenix ROM BIOS PLUS версии 1.10 A04 Процессор: Intel (R) Core (TM) 2 Duo CPU E6550 @ 2,33 ГГц (2 процессора) Память: 2004 МБ ОЗУ Файл подкачки: используется 1544 МБ, доступно 2353 МБ Windows Реж.: C:WINDOWS Версия DirectX: DirectX 9.0c (4.09.0000.0904)Параметры настройки DX: не найдены Версия DxDiag: 5.03.2600.5512 32-битный Юникод

Карта дисплея

Название карты: Семейство чипсетов Intel (R) Q35 Express Производитель: корпорация Intel Тип чипа: Intel (R) GMA 3100 Тип ЦАП: внутренний Ключ устройства: Enum PCI VEN_8086 amp; DEV_29B2 amp; SUBSYS_02111028 amp; REV_02 Память дисплея: 384,0 МБ Текущий режим: 1280 x 960 (32 бит) (60 Гц)Монитор: подключи и работай Монитор Максимальное разрешение монитора: 1600,1200 Имя драйвера: igxprd32.dll Версия драйвера: 6.14.0010.4837 (на английском языке)

Пожалуйста, помогите мне понять причину замедления рендеринга.

 <Grid x:Name="grid" Margin="3,0,0,15" HorizontalAlignment="Center" VerticalAlignment="Top" 
              IsEnabled="{Binding IsEnableOrDisableControl}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="70*" />
                <ColumnDefinition Width="05" />
                <ColumnDefinition Width="65" />
                <ColumnDefinition Width="05" />
                <ColumnDefinition Width="65" />
                <ColumnDefinition Width="05" />
                <ColumnDefinition Width="65" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition Height="05" />
                <RowDefinition Height="15" />
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <AppUserControl:NumericUPDown Value="{Binding Total, Mode=TwoWay}"
                                                     MinValue="2" MaxValue="{Binding MaxValue}" Grid.Column="0"  
                                                     Grid.Row="0"
                                                     x:Name="NoOfFltr"
                                                      />
    <Button Background="Transparent" BorderBrush="Transparent" BorderThickness="0"  
                    Grid.Column="2" Grid.Row="0" ToolTip="Plot" HorizontalAlignment="Left"
           >
                <Button.Content>
                    <Image Width="16" Height="16">
                        <Image.Source>
                            <BitmapImage UriSource="..Picturesicon.png" DecodePixelWidth="16" />
                        </Image.Source>
                    </Image>
                </Button.Content>                    
            <Button.InputBindings>
            <MouseBinding Gesture="CTRL LeftClick" Command="{Binding OpenNewWindowCommand}" CommandParameter="0" />
            <MouseBinding Gesture="LeftClick" Command="{Binding OpenCommand}" CommandParameter="1" />
            </Button.InputBindings>
    </Button>
            <TextBlock Text="Text1" Height="20" VerticalAlignment="Top" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="0" />
            <TextBlock Text="Text2" Height="20" VerticalAlignment="Top" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="2" />
            <TextBlock Text="Text3" Height="20" VerticalAlignment="Top" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="4" />
            <TextBlock Text="Text4" Height="20" VerticalAlignment="Top" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="6" />
            <Grid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="7" HorizontalAlignment="Left" Height="{Binding DataParameterHeight}">
                <ItemsControl Name="BiquadItem" ItemsSource="{Binding Parameters }">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid Margin="3">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="70*" />
                                    <ColumnDefinition Width="05" />
                                    <ColumnDefinition Width="65" />
                                    <ColumnDefinition Width="05" />
                                    <ColumnDefinition Width="65" />
                                    <ColumnDefinition Width="05" />
                                    <ColumnDefinition Width="65" />
                                </Grid.ColumnDefinitions>
                        <ComboBox Name="cmbType" Width="70"  HorizontalAlignment="Left" VerticalAlignment="Top" 
                                  ItemsSource="{Binding Source={StaticResource mdwType}}" Grid.Column="0" SelectedValue="{Binding bqType, Mode=TwoWay}" >
                                </ComboBox>
                                <AppUserControl:UnitUpDown  Value="{Binding frq, Mode=TwoWay}" MinValue="0"
                                                     MaxValue="24000" Grid.Column="2" IsEnabled="{Binding Status}" Increment="1" 
                                                      />
                                <AppUserControl:NumericUPDown Value="{Binding scale, Mode=TwoWay}"
                                                     Grid.Column="4" IsEnabled="{Binding Status}" DecimalPoint="2" Increment="0.01" 
                                                     MinValue="{Binding ElementName=biquadGrid, Path=DataContext.MinVal}" 
                                                     MaxValue="{Binding ElementName=bqgrid, Path=DataContext.MaxVal}" />
                                <AppUserControl:NumericUPDown Value="{Binding qFactors, Mode=TwoWay}"
                                                     MinValue="0.001" MaxValue="24" Grid.Column="6" IsEnabled="{Binding qStatus}"  DecimalPoint="3" Increment="0.01" 
                                                      />
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>                   
            </Grid>
        </Grid>
  

Комментарии:

1. Это во многом зависит от того, что вы визуализируете — помимо более 200 пользовательских элементов управления, каковы они? Какие-либо эффекты?

2. Чего я не понимаю, так это почему вы используете XP на компьютере i5 — вы уверены, что используете чип Nvidia, а не встроенное ядро i5 GPU? В 1-м поколении они были довольно мусорными, так что, возможно, это ваша проблема

3. Спасибо за ответ. Я использую один пользовательский интерфейс, который содержит 1 текстовое поле и 2 кнопки повтора. И этот пользовательский элемент управления отображается более 200 раз во вложенных itemscontrol. Приведенный выше код XAML вызывается в пользовательском элементе управления, в котором используется вложенный itemscontrol.

4. Который . Вы используете сетевую версию, и есть ли у вас какие-либо инструменты, подобные менеджеру буфера обмена, работающие в фоновом режиме? Используете ли вы сенсорный планшет или что-то подобное в качестве устройства ввода или установлены драйверы для таких устройств? В сочетании с .NET 4.0 они могут быть частично ответственны за такое большое падение производительности.

Ответ №1:

Вы можете использовать пакет производительности WPF от Microsoft (моя изюминка):

Пакет производительности WPF позволяет анализировать поведение приложений WPF во время выполнения и определять возможные способы оптимизации производительности. Пакет производительности WPF включает в себя инструменты профилирования производительности, называемые Perforator и Visual Profiler.

Рендеринг 200 сложен UserControl's в an ItemsControl — это много — по крайней мере, для взаимодействия с пользователем. Узким местом может быть графическая мускулатура ноутбука. Вы могли бы рассмотреть возможность использования a ListBox для отображения UserControl's . ListBox использует a VirtualizingStackPanel для включения виртуализации пользовательского интерфейса.

Кроме того, в зависимости от поддержки DirectX в Windows XP на вашем оборудовании могут возникнуть проблемы с производительностью. Вы даже можете попробовать отключить аппаратное ускорение в свойствах отображения компьютера с Windows XP, чтобы посмотреть, улучшает ли это производительность WPF.

Комментарии:

1. Мы уже пытались использовать его, но в Windows XP мы не можем использовать перфоратор и визуальный профилировщик. Я также вставил пример кода, который я использую в пользовательском элементе управления.