C#中的GIF动画CPU消耗问题!
我制作了一个GIF动画用户控件,用于加载GIF动画,并在我的项目中创建了大约30个GIF动画,每个动画都是GIF动画。问题是,当我检查我的CPU使用率时,它大约是70%+!!!我肯定这有问题! 请帮帮我。以下是该GIF Animator控件的代码: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
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使用率更低的动画。谢谢