Низкая производительность при анимации свойства преобразования с использованием раскадровки - PullRequest
0 голосов
/ 07 сентября 2018

В моем приложении 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, если это возможно, поскольку это все визуальные эффекты.

...