C#中利用雙緩衝技術解決繪圖閃屏問題。

  這段時間在作一個小型遊戲,在界面顯示的時候用到了一些圖形。一開始涉及到的圖形全都用控件的背景圖片代替了。這樣遊戲運行的時候存在的一個很大的問題是遊戲運行很慢。小組成員費盡周折,即將放棄,每個成員都愁眉苦臉。我這內心也挺心酸的。。。學習

  好的廢話很少說了。爲了改善遊戲的運行效果,把原來控件的方式全都改爲繪圖的方式,即用C#中DrawImage()方法進行繪圖,能夠改善遊戲運行慢的問題。而後開始測試DrawImage()方法的使用。圖片卻是出來了,並且也能夠移動了,可是致命的問題出現了。就是圖片在移動的時候(實質上是圖片的重繪)出現了閃屏的問題。測試

  爲了解決這個問題,在網上找了不少資料,參考了不少書,能解決閃屏問題的解決方法就是利用C#中提供的一種雙緩衝技術。this

  可是網上或書上沒有一個可以經過一個簡單的例子直接讓我明白如何使用雙緩衝技術的。花了好幾個小時的時間,最終仍是本身琢磨出來了。分享給你們。同時也把個人這個簡單的測試小例子供你們學習,如何快速應用雙緩衝技術解決問題。spa

1.首先創建一個工程,在窗口中添加一個按鈕。當點擊這個按鈕式就開始顯示圖片的移動。code

2.雙緩衝我採用的方法是:orm

  先創建一個虛擬畫布,並在Form1()的方法中加入對象

     SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint,
true); // 禁止擦除背景.
            SetStyle(ControlStyles.DoubleBuffer, true);blog

  

private Graphics g;
        Bitmap bmp = new Bitmap(600, 600);//這裏是建立一個畫布
        Graphics g1;
        private int x=0;
        public Form1()
        {
            
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
            SetStyle(ControlStyles.DoubleBuffer, true);
            g1 = Graphics.FromImage(bmp);//這裏是在畫布上創建一個Graphics對象,爲了在畫布上畫圖形
            
            
            InitializeComponent();
            
        }

 

而後經過單擊按鈕事件,在畫布上顯示圖片並將畫布顯示到窗口遊戲

//button1的單擊處理事件
        private void button1_Click(object sender, EventArgs e)
        {
            
            //g1.DrawEllipse(new Pen(System.Drawing.Color.Red), 10, 10, 100, 100);
            g1.DrawImage(Image.FromFile("E:/down.png"), x, 10);//這是在畫布上繪製圖形
           this.CreateGraphics().DrawImage(bmp, 0, 0);//這句是將圖形顯示到窗口上
            timer1.Enabled = true;
           // g.Dispose();
        }

最後在經過timer控件使圖片不斷移動,代碼以下:事件

private void timer1_Tick(object sender, EventArgs e)
        {
            
            x++;//這是一個全局變量,用來改變圖片的橫座標
            g1.Clear(Form1.DefaultBackColor);//這是清除畫布中前一個圖片
            g1.DrawImage(Image.FromFile("E:/down.png"), x, 10);//重繪新的圖片,此時位置較以前的地方橫座標加1了
            this.CreateGraphics().DrawImage(bmp, 0, 0);//再次顯示到窗口上,沒有閃動
        }

如沒有加SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
            SetStyle(ControlStyles.DoubleBuffer, true);代碼,將會出現屏幕閃動。

下面給出完整的代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ttest
{
    public partial class Form1 : Form
    {
        private Graphics g;
        Bitmap bmp = new Bitmap(600, 600);//這裏是建立一個畫布
        Graphics g1;
        private int x=0;
        public Form1()
        {
            
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
            SetStyle(ControlStyles.DoubleBuffer, true);
            g1 = Graphics.FromImage(bmp);
            
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
           // g1 = this.CreateGraphics();
            
        }
        //button1的單擊處理事件
        private void button1_Click(object sender, EventArgs e)
        {
            
            //g1.DrawEllipse(new Pen(System.Drawing.Color.Red), 10, 10, 100, 100);
            g1.DrawImage(Image.FromFile("E:/down.png"), x, 10);//這是在畫布上繪製圖形
           this.CreateGraphics().DrawImage(bmp, 0, 0);//這句是將圖形顯示到窗口上
            timer1.Enabled = true;
           // g.Dispose();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            
            x++;//這是一個全局變量,用來改變圖片的橫座標
            g1.Clear(Form1.DefaultBackColor);//這是清除畫布中前一個圖片
            g1.DrawImage(Image.FromFile("E:/down.png"), x, 10);//重繪新的圖片,此時位置較以前的地方橫座標加1了
            this.CreateGraphics().DrawImage(bmp, 0, 0);//再次顯示到窗口上,沒有閃動
        }

        

       
    }
}

弄了一下午,終於解決閃屏問題了。。。

相關文章
相關標籤/搜索