2010-08-27 72 views
1

我做了一個GIF動畫用戶控件,它加載了gif動畫,並且在我的項目中創建了大約30個動畫GIF的動畫。問題是,當我檢查我的CPU使用率時,它約爲70%!我相信這有點不對勁! 請幫幫我。這裏是一個GIF動畫控件的代碼:GIF動畫C#中的CPU消耗問題!

public class AnimatedImage : System.Windows.Controls.Image 
{ 
    private BitmapSource[] _BitmapSources = null; 
    private int _nCurrentFrame=0; 


    private bool _bIsAnimating=false; 

    public bool IsAnimating 
    { 
     get { return _bIsAnimating; } 
    } 

    static AnimatedImage() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(AnimatedImage), new FrameworkPropertyMetadata(typeof(AnimatedImage))); 
    } 
    public Bitmap AnimatedBitmap 
    { 
     get { return (Bitmap)GetValue(AnimatedBitmapProperty); } 
     set { StopAnimate(); SetValue(AnimatedBitmapProperty, value); } 
    } 

    /// <summary> 
    /// Identifies the Value dependency property. 
    /// </summary> 
    public static readonly DependencyProperty AnimatedBitmapProperty = 
     DependencyProperty.Register(
      "AnimatedBitmap", typeof(Bitmap), typeof(AnimatedImage), 
      new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnAnimatedBitmapChanged))); 

    private static void OnAnimatedBitmapChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     AnimatedImage control = (AnimatedImage)obj; 

     control.UpdateAnimatedBitmap(); 

     RoutedPropertyChangedEventArgs<Bitmap> e = new RoutedPropertyChangedEventArgs<Bitmap>(
      (Bitmap)args.OldValue, (Bitmap)args.NewValue, AnimatedBitmapChangedEvent); 
     control.OnAnimatedBitmapChanged(e); 
    } 

    /// <summary> 
    /// Identifies the ValueChanged routed event. 
    /// </summary> 
    public static readonly RoutedEvent AnimatedBitmapChangedEvent = EventManager.RegisterRoutedEvent(
     "AnimatedBitmapChanged", RoutingStrategy.Bubble, 
     typeof(RoutedPropertyChangedEventHandler<Bitmap>), typeof(AnimatedImage)); 

    /// <summary> 
    /// Occurs when the Value property changes. 
    /// </summary> 
    public event RoutedPropertyChangedEventHandler<Bitmap> AnimatedBitmapChanged 
    { 
     add { AddHandler(AnimatedBitmapChangedEvent, value); } 
     remove { RemoveHandler(AnimatedBitmapChangedEvent, value); } 
    } 

    /// <summary> 
    /// Raises the ValueChanged event. 
    /// </summary> 
    /// <param name="args">Arguments associated with the ValueChanged event.</param> 
    protected virtual void OnAnimatedBitmapChanged(RoutedPropertyChangedEventArgs<Bitmap> args) 
    { 
     RaiseEvent(args); 
     } 
    private void UpdateAnimatedBitmap() 
    {      
     int nTimeFrames = AnimatedBitmap.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); 
     _nCurrentFrame = 0; 
     if (nTimeFrames > 0) 
     { 

      _BitmapSources = new BitmapSource[nTimeFrames]; 

      for (int i = 0; i < nTimeFrames; i++) 
      { 

       AnimatedBitmap.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Time, i); 
       Bitmap bitmap = new Bitmap(AnimatedBitmap); 
       bitmap.MakeTransparent(); 

       _BitmapSources[i] = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
        bitmap.GetHbitmap(), 
        IntPtr.Zero, 
        Int32Rect.Empty, 
        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 
      } 
      StartAnimate(); 
     } 
    } 
    private delegate void VoidDelegate(); 

    private void OnFrameChanged(object o, EventArgs e) 
    { 
     Dispatcher.BeginInvoke(DispatcherPriority.Render, new VoidDelegate(delegate { ChangeSource(); })); 

    } 
    void ChangeSource() 
    {    
     Source = _BitmapSources[_nCurrentFrame++]; 
     _nCurrentFrame = _nCurrentFrame % _BitmapSources.Length; 
     ImageAnimator.UpdateFrames(); 

    } 

    public void StopAnimate() 
    { 
     if (_bIsAnimating) 
     { 
      ImageAnimator.StopAnimate(AnimatedBitmap, new EventHandler(this.OnFrameChanged)); 
      _bIsAnimating = false; 
     } 
    } 

    public void StartAnimate() 
    { 
     if (!_bIsAnimating) 
     { 

      ImageAnimator.Animate(AnimatedBitmap, new EventHandler(this.OnFrameChanged)); 
      _bIsAnimating = true; 
     } 
    } 

} 

}

回答

1

this one了一槍。我們已經在我們的應用程序中使用它,我沒有注意到任何奇怪的內存消耗。

+0

我的問題不是內存消耗,它消耗CPU使用! – Moh 2010-08-28 15:29:18

+0

它的工作......謝謝卡羅:-) – Moh 2010-09-12 06:33:23

+0

@MohammadAliannejadi看起來像網站已經死了,你能分享代碼嗎?我想要一些CPU使用率較低的動畫。謝謝 – qakmak 2016-05-11 08:12:40