2010-12-16 226 views
1

我想在WPF中创建一个闪亮的加载微调器。它应该在圆圈中有圆圈,并且它应该旋转,在处理某些数据时给用户看看的东西。附图。您可能会注意到实际结果质量稍差。这是因为无论我尝试做什么,微调器都需要大约5到7%的CPU。这是我不能接受的,因为......好吧,这是一个微调。它在计算机忙着做某事的时候出现了,我坦率地希望它能尽早做到这一点。在WPF中创建一个简单的加载动画的性能问题

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 
        }; 
} 

微调构造

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”属性我没有设置,我将非常有义务找出在哪里以及如何...

在此先感谢。

回答

2

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

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

默认为60fps的。

问候, 科林·E.

+0

非常感谢您科林,这走近就像一个魅力的工作。另一方面,单个椭圆的动画不透明度消耗尽可能多的CPU。 – Gleno 2010-12-17 01:58:41

1

而不是使用一个旋转变换相对昂贵的,为什么不改变这是一个便宜得多动作椭圆的透明度?

吉拉德。

+0

没有工作。 :( – Gleno 2010-12-17 01:59:01