在WPF中创建简单加载动画的性能问题

时间:2010-12-16 08:22:20

标签: c# wpf performance animation

我正在尝试在WPF中创建一个闪亮的加载微调器。它应该在圆圈中有圆圈,它应该旋转,在我处理一些数据时给用户一些东西。附图。您可能会注意到实际结果质量稍差。那是因为无论我尝试做什么,微调器占用大约5%到7%的CPU。这对我来说是不可接受的,因为......好吧,它是一个微调器。当计算机忙于做某事时,它会旋转,我坦率地希望它能够尽快做到这一点。

http://image.bayimg.com/babieaadh.jpg

好的,所以XAML代码定义了两个嵌套网格,如下所示:

<Grid 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="WPFTest.Spinner"
    Name="View" Width="40" Height="40">
    <Grid Name="Grid" Width="40" Height="40" >
        <Grid.CacheMode>
            <BitmapCache EnableClearType="False" RenderAtScale="1" SnapsToDevicePixels="False"/>
        </Grid.CacheMode>
    </Grid>
</Grid>

其余部分在代码隐藏中,基本上添加了一些省略号并设置了动画。

首先创建省略号的方法:

    private static Ellipse GetEllipse(double x, double y, double opacity)
    {
        return new Ellipse
                   {
                       Fill = new SolidColorBrush(Colors.White),
                       Width = Size,
                       Height = Size,
                       Margin = new Thickness(x, y, 0, 0),
                       Opacity = opacity
                   };
}

Spinner构造函数

   public Spinner()
    {
        InitializeComponent();

        const double step = 2 * Math.PI / Count; //Cound is const = 8
        const double r = 1.4 * Field; //Field is const = 40

        double angle = 0;
        for (var i = 0; i < Count; i++)
        {
            Grid.Children.Add(GetEllipse(r * Math.Cos(angle),  r * Math.Sin(angle), 1 - i/(double) Count));
            angle += step;
        }

        _doubleAnimation = new DoubleAnimation(0, 360, new Duration(new TimeSpan(0, 0, 1)))
                              {
                                  RepeatBehavior = RepeatBehavior.Forever,
                              };
        Grid.RenderTransform = new RotateTransform(0, Field, Field);
        RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor); //Low quality!
        Grid.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, _doubleAnimation );
    }

现在所有这些基本上都有效,当你删除将所有内容设置为低质量的行时,它甚至有点漂亮。但它最终毫无用处。如果我正在加载某些东西并且这个微调器需要占我CPU的5-7%,那么对我来说这是一个问题。当然,多核...无论如何。不,这应该有效! :)

修复此问题的另一个最佳方法是旋转微调器,而不是在一段时间后重置每个椭圆的颜色。我最终会尝试这一点,但同时知道发生了什么以及为什么这样简单的动画永远消失将是非常有趣的。此外,如果我没有设置“MakeAnimationWorkBetter”属性,我将不得不找出在哪里以及如何...

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以通过TimeLine.DesiredFrameRate附加属性降低动画的帧速率:

<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:0.5" 
             From="1.0" To="0.5" Timeline.DesiredFrameRate="30" />

默认值为60fps。

此致 科林E.

答案 1 :(得分:1)

为什么不改变椭圆的不透明度,而不是使用相对昂贵的旋转变换呢?

吉拉德。

答案 2 :(得分:0)