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

就是每次都從磁盤讀取圖片,速度慢,所以會出現卡屏現象。

希望對大家有幫助,也希望大家提出更好的解決辦法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM