用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 - 我编程我快乐

时间:2024-02-18 16:28:00

正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术。以为不会有什么问题了。后来当把图片全部绘制上去的时候依然出现了卡屏的问题。这个问题困扰了我将近半个月了。马上就要规定的时间了。而且又是一个五一假期。小盆友们都去玩了。自习室少有的几个人还在上着自习,而我为了解决这个问题。也渡过了苦逼的两天。大早上7:30开始一直到晚上10点多。。。好了废话不多说了。开始进入正题。

问题细节:用绘图功能实现动画显示,也就是不断变换绘制图片的位置,达到动画的效果。结果出现了卡屏问题,就是运行的特别的卡、慢。

在网上找了很多资料参考,但是没有一个系统的示例说明具体的使用过程,我把我的总结给大家说一下。

解决思路:先将图片加载到内存(因为直接从磁盘读取文件要比在内存读取文件慢的多,这是导致卡屏出现的主要原因),然后在从内存中读取出来(即把二进制流转换为Image)

解决步骤:

  

  1.先将图片放到内存中。就是以将图片以二进制流的形式加载到内存。

  /// <summary> 
        /// 图片转换成字节流 
        /// </summary> 
        /// <param name="img">要转换的Image对象</param> 
        /// <returns>转换后返回的字节流</returns> 
       
        public static byte[] ImgToByt(Image img)
        {
            MemoryStream ms = new MemoryStream();
            byte[] imagedata = null;
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            imagedata = ms.GetBuffer();
            return imagedata;
        }
        /// <summary> 
        /// 字节流转换成图片 
        /// </summary> 
        /// <param name="byt">要转换的字节流</param> 
        /// <returns>转换得到的Image对象</returns> 
        public static Image BytToImg(byte[] byt)
        {
            MemoryStream ms = new MemoryStream(byt);
            Image img = Image.FromStream(ms);
            return img;
        }

这段是参考网上的代码。

  2.然后定义一个Image类型的变量,这个变量作为我们绘图时使用:

public Image fish ;

   3.对Image类型 的变量赋值,即当我们程序加载的时候fish图片在使用的时候就不是在磁盘取得了,这样速度要快的多。

fish = BytToImg(ImgToByt(Image.FromFile("../../image/down.png")));

  3.然后在使用fish进行绘图。

g1.DrawImage(fish, 0,0);

这样在改变fish位置绘图,就不会出现卡屏现象了。

如果用下面的方法绘图:

g1.DrawImage(Image.FromFile("../../image/down.png"), 0,0);

就是每次都从磁盘读取图片,速度慢,所以会出现卡屏现象。

希望对大家有帮助,也希望大家提出更好的解决办法。