В нашем приложении у нас есть прокрутка кредитов в ChildWindow
. При отображении этого окна использование нашего процессора очень велико. Текст использует BitmapCache
, а аппаратное ускорение включено. Даже после удаления отсекающего прямоугольника и тени из дочернего окна, использование ЦП поднимается до 80-90%. Когда я включаю визуализацию области перерисовки, я вижу, что только прокручиваемый текст перерисовывается, поэтому я не уверен, почему процессор сходит с ума. Я попробовал оживить как Canvas.Top
, так и TranslateY
объект CompositeTransform
, чтобы сделать прокрутку.Прокрутка анимации Silverlight использует большое количество времени процессора
Любые идеи относительно того, что может вызвать такую анимацию настолько дорого? Есть ли хорошие статьи, которые содержат рекомендации по оптимизации анимации в целом? Вот мой XAML:
<c:ChildWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="OurNamespace.UI.Views.AboutWindow"
Title="About Our App" Width="575"
Height="330" Style="{StaticResource ChromelessChildWindowStyle}"
mc:Ignorable="d"
MouseRightButtonDown="ChildWindow_MouseRightButtonDown"
Background="Black">
<Grid x:Name="LayoutRoot" CacheMode="BitmapCache">
<Grid.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard Storyboard.TargetName="CreditsTransform"
Storyboard.TargetProperty="TranslateY">
<DoubleAnimation To="-750" RepeatBehavior="Forever"
Duration="0:0:30"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<Image HorizontalAlignment="Left" VerticalAlignment="Top"
Source="/Assets/Graphics/SplashAbout/OurBackground.png"/>
<Grid Height="150" Width="570" HorizontalAlignment="Right"
Margin="0,0,0,80" VerticalAlignment="Bottom">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock x:Name="AppVersionTextBlock" Margin="10,0"
VerticalAlignment="Center" FontFamily="Arial"
FontSize="12" Foreground="White"
Text="{Binding VersionInfo, FallbackValue=Version 2.0.0}"
TextWrapping="Wrap"/>
<TextBlock x:Name="FirmwareVersionTextBlock" Margin="10,0"
VerticalAlignment="Center" FontFamily="Arial" FontSize="12"
Foreground="White" Text="{Binding FirmwareVersion.Value, FallbackValue=Firmware Version 1.0.0}"
TextWrapping="Wrap"
Visibility="{Binding FirmwareVersionVisibility.Value}"
TextAlignment="Right"/>
<Canvas Margin="0" Grid.Row="1" x:Name="Viewport">
<Canvas.Clip>
<RectangleGeometry Rect="0,0,575,120"/>
</Canvas.Clip>
<TextBlock FontFamily="Arial" FontSize="12" Width="555"
Foreground="White" TextWrapping="Wrap" Canvas.Left="10"
Text="{Binding Credits}" x:Name="Credits"
TextAlignment="Center" RenderTransformOrigin="0.5,0.5">
<TextBlock.RenderTransform>
<CompositeTransform TranslateY="0" x:Name="CreditsTransform"/>
</TextBlock.RenderTransform>
<TextBlock.CacheMode>
<BitmapCache/>
</TextBlock.CacheMode>
</TextBlock>
</Canvas>
</Grid>
<TextBlock Foreground="White" Text="{Binding CopyrightInfo, FallbackValue=© 2010 Our Company}"
TextWrapping="Wrap" Width="413" FontSize="10"
FontFamily="Arial" Height="44" HorizontalAlignment="Right"
Margin="0,0,30,21" VerticalAlignment="Bottom"/>
<Button x:Name="CancelButton" Width="575" Height="330" Opacity="0"
Click="CancelButton_Click" HorizontalAlignment="Right"
Margin="0" VerticalAlignment="Bottom"/>
</Grid>
</c:ChildWindow>
Update:
Проблема CPU не была непосредственно связана с самим ChildWindow
но к DropShadowEffect
объектов под которыми Silverlight была расточительно повторно-рендеринга. Я добавил ответ, чтобы описать, как я работал над этим.
Отличный ответ. Я попытался изменить режим текстовых подсказок на анимацию, и хотя это помогло немного, использование ЦП по-прежнему огромно. Я попробую XPerf. – Jacob
Взрыв! Похоже, что XPerf недоступен в Windows XP, который по какой-то причине наша компания предпочитает придерживаться. Есть ли что-то подобное для XP? – Jacob
Похоже, вы можете запустить xperf.exe, который используется для сбора данных CPU в Windows XP, но для запуска и анализа данных вам понадобится Server 2008, Vista или 7, чтобы запустить xperfview.exe. Это почти бесполезно, не имея возможности легко просматривать данные. Не уверен в другом способе без более новой ОС или какой-то виртуальной машины ... http://blogs.msdn.com/b/pigscanfly/archive/2008/02/24/xperf-support-for-xp. ASPX –