Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的GIF动画CPU消耗问题!_C#_Wpf_Animation_Cpu Usage_Gif - Fatal编程技术网

C#中的GIF动画CPU消耗问题!

C#中的GIF动画CPU消耗问题!,c#,wpf,animation,cpu-usage,gif,C#,Wpf,Animation,Cpu Usage,Gif,我制作了一个GIF动画用户控件,用于加载GIF动画,并在我的项目中创建了大约30个GIF动画,每个动画都是GIF动画。问题是,当我检查我的CPU使用率时,它大约是70%+!!!我肯定这有问题! 请帮帮我。以下是该GIF Animator控件的代码: public class AnimatedImage : System.Windows.Controls.Image { private BitmapSource[] _BitmapSources = null; private in

我制作了一个GIF动画用户控件,用于加载GIF动画,并在我的项目中创建了大约30个GIF动画,每个动画都是GIF动画。问题是,当我检查我的CPU使用率时,它大约是70%+!!!我肯定这有问题! 请帮帮我。以下是该GIF Animator控件的代码:

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

}
public类AnimatedImage:System.Windows.Controls.Image
{
私有BitmapSource[]_BitmapSources=null;
private int_nCurrentFrame=0;
私有bool_bIsAnimating=false;
公共场所的污染
{
获取{return\u bIsAnimating;}
}
静态动画图像()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(animateImage),new FrameworkPropertyMetadata(typeof(animateImage));
}
公共位图动画位图
{
获取{return(位图)GetValue(AnimatedBitmapProperty);}
set{StopAnimate();SetValue(AnimatedBitmapProperty,value);}
}
/// 
///标识值依赖项属性。
/// 
公共静态只读从属属性AnimatedBitmapProperty=
从属属性。寄存器(
“动画位图”、类型化(位图)、类型化(动画图像),
新的FrameworkPropertyMetadata(null,新的PropertyChangedCallback(OnAnimatedBitmapChanged));
NimatedBitMapChanged上的私有静态无效(DependencyObject对象,DependencyPropertyChangedEventArgs参数)
{
animateImage控件=(animateImage)对象;
control.UpdateAnimatedBitmap();
RoutedPropertyChangedEventArgs e=新RoutedPropertyChangedEventArgs(
(位图)args.OldValue,(位图)args.NewValue,AnimatedBitmapChangedEvent);
控制。OnAnimatedBitmapChanged(e);
}
/// 
///标识ValueChanged路由事件。
/// 
公共静态只读RoutedEvent AnimatedBitmapChangedEvent=EventManager.RegisterRoutedEvent(
“动画位图更改”,路由策略泡泡,
typeof(RoutedPropertyChangedEventHandler)、typeof(AnimateImage));
/// 
///值属性更改时发生。
/// 
公共事件RoutedPropertyChangedEventHandler动画位图已更改
{
添加{AddHandler(AnimatedBitmapChangedEvent,value);}
移除{RemoveHandler(AnimatedBitmapChangedEvent,值);}
}
/// 
///引发ValueChanged事件。
/// 
///与ValueChanged事件关联的参数。
NimatedBitMapChanged上受保护的虚拟无效(RoutedPropertyChangedEventArgs args)
{
RaiseEvent(args);
}
私有void UpdateAnimatedBitmap()
{                       
int nTimeFrames=AnimatedBitmap.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);
_nCurrentFrame=0;
如果(nTimeFrames>0)
{
_BitmapSources=新的BitmapSource[nTimeFrames];
对于(int i=0;i

}试一试。我们在应用程序中使用了它,我没有注意到任何奇怪的内存消耗。

试一试。我们在应用程序中使用了它,我没有注意到任何奇怪的内存消耗。

我的问题不是内存消耗,而是CPU使用率@MohammadAliannejadi看起来这个网站已经死了,你能分享一下代码吗?我想要一些CPU使用率更低的动画。谢天谢地,我的问题不是内存消耗,而是CPU使用率@MohammadAliannejadi看起来这个网站已经死了,你能分享一下代码吗?我想要一些CPU使用率更低的动画。谢谢