在WPF应用程序中,我有一个背景图像,我想通过缓慢调整其X位置(特别是通过增加图像的平移变换的X属性来对其进行动画处理)
起初,我在XAML中使用了一个故事板,如下所示:
<Grid Grid.Row="1" Panel.ZIndex="-1">
<Grid.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="backgroundTransform" Storyboard.TargetProperty="X"
From="1" To="0" Duration="0:0:45" RepeatBehavior="Forever" Timeline.DesiredFrameRate="30"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<Grid.Background>
<ImageBrush ImageSource="../ocean.jpg" TileMode="FlipXY" Stretch="UniformToFill">
<ImageBrush.RelativeTransform>
<TransformGroup>
<TranslateTransform X="0" x:Name="backgroundTransform"/>
</TransformGroup>
</ImageBrush.RelativeTransform>
</ImageBrush>
</Grid.Background>
</Grid>
此方法有效,但是却导致性能严重下降,CPU使用率为14%,GPU使用率为14%。因此,我尝试使用计时器手动进行操作:
System.Windows.Threading.DispatcherTimer timer2 = new System.Windows.Threading.DispatcherTimer();
timer2.Tick += new EventHandler(OceanTranslate);
timer2.Interval = new TimeSpan(0, 0, 0, 0, 1000/60);
...
private void OceanTranslate(Object _object, EventArgs _eventArgs)
{
imageOffset += 1.0 / (30.0*45.0);
backgroundTransform.X = imageOffset;
}
这效率更高,CPU使用率为4%,GPU使用为10%。
我的问题是故事板方法为什么这么慢,我可以做些什么来改进它?因为如果可能的话,我想使用纯XAML,因为这都是视觉效果。