正在用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);
就是每次都从磁盘读取图片,速度慢,所以会出现卡屏现象。
希望对大家有帮助,也希望大家提出更好的解决办法。