zoukankan      html  css  js  c++  java
  • 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法

    正在用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);

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

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

  • 相关阅读:
    http强转https websocket
    apache http添加证书转成https
    insert into
    分割字符串和截取字符串:split 和substring
    java实现http请求
    Oracle 中 decode 函数用法
    LeetCode:154. 寻找旋转排序数组中的最小值 II
    LeetCode:153. 寻找旋转排序数组中的最小值
    LeetCode:151. 翻转字符串里的单词
    LeetCode:145. 二叉树的后序遍历
  • 原文地址:https://www.cnblogs.com/zhangyongJava/p/3704808.html
Copyright © 2011-2022 走看看