正在用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); 就是每次都從磁盤讀取圖片,速度慢,所以會出現卡屏現象。 希望對大家有幫助,也希望大家提出更好的解決辦法。