2010-12-16 64 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