В моем приложении 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>
Это работает, однако это привело к значительному снижению производительности: загрузка ЦП составляет 14%, а загрузка графического процессора - 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;
}
Это было намного эффективнее, при использовании процессора 4% и графического процессора 10%.
Мой вопрос: почему метод раскадровки такой медленный, и могу ли я сделать что-нибудь, чтобы улучшить его? Потому что я хотел бы использовать для этого чистый XAML, если это возможно, поскольку это все визуальные эффекты.