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