#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 мы не можем использовать перфоратор и визуальный профилировщик. Я также вставил пример кода, который я использую в пользовательском элементе управления.