日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Winodows图形编程]初识双缓冲技术

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Winodows图形编程]初识双缓冲技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

為完成PaintBoardDemo(本人設計的一個基于.NET Framework的WinForm的畫圖程序),過程中遇到的技術難點之一就是就是要顯示任何圖形繪制過程中的軌跡,也即需要在pictureBox控件的MouseMove事件中添加相應的Graphics對象的DrawXX Methods. ?????? 在設計之初,僅僅能夠在MouseMove事件中寫出一行代碼:g.DrawLine(new Pen(Color.Red),ptLast.X,ptLast.Y,e.X,e.Y)(ptLast為Point類型的全局變量,用以保存MouseDown事件的坐標)。可想而知,鼠標的每一次Move就將觸發MouseMove事件,即執行一次g.DrawLine(畫一條直線)。因此程序運行的結果就是,畫板上顯示了繪制過程中的所有軌跡,如下圖,顯然,這是與我們的設計目的相不符的。 經過對Bitmap與Graphics的學習及經過同學開導,終于解決了不顯示繪制過程中多余軌跡的問題。基本實現的思想可以總結如下: ?????? 1.建立一個位圖對象,即Bitmap _bitmapTemp,和一個Graphics對象用來實現一系列繪制操作,即Graphics g(_bitmapTemp,g均為全局變量)。 ?????? 2.在主窗體的Shown事件中,對_bitmapTemp和g進行初始化: ??????? _bitmapTemp=new Bitmap(pictureBox.Width,pictureBox.Height);//初始化位圖大小和pictureBox一致 ?????? Graphics.FromImage(_bitmapTemp).FillRectangle(Brushes.White,0,0,pictureBox.Width,pictureBox.Height);//并且將位圖_bitmapTemp以白色填充全部區域,以作繪制之用。 ?????? g=pictureBox.CreateGraphics();//實例化g對象,表明以后對g的所有繪制操作均在pictureBox之上。 ?????? pictureBox.Image=_bitmapTemp;//“引用傳遞”,將pictureBox.Image&_bitmapTemp指向內存中同一塊位圖,實現在pictureBox顯示實時的繪制結果。 ?????? 3.pictureBox的MouseMove事件中執行繪制操作: ?????? g.DrawImage(_bitmapTemp,0,0);//在第N次繪制時,將第N-1次繪制所得的結果畫到pictureBox中,既實現了繪制結果的同步顯示,也消除了第N次繪制過程中產生的軌跡。 ?????? g.DrawLine(new Pen(Color.Red),ptLast.X,ptLast.Y,e.X,e.Y);//繪制直線。 ????? 4.pictureBox的MouseUp事件中將繪制結果繪制到_bitmapTemp,保證繪制結果的正確性(所繪的圖形均被保留): ?????? Graphics.FromImage(_bitmapTemp).DrawLine(new Pen(Color.Red),ptLast.X,ptLast.Y,e.X,e.Y); ?????? 至此,就可以在pictureBox中繪制各類圖形了(調用Graphics類的DrawXX Methods即可)。但是會發現整個繪制過程中,圖形的閃動極其厲害。為什么呢?回過頭來再看代碼,發現問題出在g.DrawImage(_bitmapTemp,0,0);每次MouseMove,就在pictureBox中將之前的圖全部重新繪制一次,往往繪制過程中觸發的MouseMove事件是不計其數的,頻繁的重繪全圖,不僅效率低下,更帶來了直觀的閃動問題。但是也不可能把這行代碼去掉,它可是解決繪制軌跡問題的核心代碼。 ?????? 百度了關于閃動優化的方法,發現不少都提到了“雙緩沖"技術,參照著網上的方法,發現閃動問題確實得到了解決。看來有必要對這個雙緩沖技術進行一下學習。 ?????? 雙緩沖解決閃動問題的原理主要是由于當啟用雙緩沖時,所有繪制操作均呈現到內存緩沖區,而不是在屏幕上繪制。所有繪制完成之后,內存緩沖區直接復制到與其關聯的繪制區域。因為在屏幕上只執行了一次圖形操作,所以消除了由復雜操作造成的圖像閃爍。 ?????? 【默認雙緩沖】?????? ?????? 在應用程序中啟用雙緩沖的最簡便的方法是使用.NET Framework為窗體和控件提供的默認雙緩沖。通過將DoubleBuffered屬性設置為True或者使用SetStyle方法可以為Windows窗體和所創作的Windows控件啟用默認雙緩沖。 public void EnableDoubleBuffering() { // Set the value of the double-buffering style bits to true. this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); }

?????? 【管理和顯示緩沖的圖形】

????????? .NET中負責單獨分配和管理圖形緩沖區的類是BufferedGraphicsContext類。每個應用程序都有自己的默認BufferedGraphicsContext實例來管理此應用程序的所有默認雙緩沖。大多數情況下,每個應用程序只有一個應用程序域,所以每一個應用程序通常只有一個BufferedGraphicsContext。默認 BufferedGraphicsContext 實例由 BufferedGraphicsManager 類管理。通過調用 BufferedGraphicsManager.Current 屬性可以檢索對默認 BufferedGraphicsContext 實例的引用。還可以創建一個專用的 BufferedGraphicsContext 實例以提高圖形密集型應用程序的性能。介紹一下所需用到的幾個類。 ?????? BufferedGraphicsContext類提供創建圖形緩沖區的方法,該緩沖區可以用于雙緩沖,創建用于繪制緩沖圖形的 BufferedGraphics 實例。 ?????? BufferedGraphicsManager可以實現圖形的自定義雙緩沖,提供對應用程序域的主緩沖圖形上下文對象的訪問。此類有一個靜態屬性Current,該屬性返回當前應用程序域的主BufferGraphicsContext ?????? BufferedGraphics類用于繪制緩沖圖形,它沒有公共的構造函數,必須有應用程序域的BufferedGraphicsContext對象使用其Allocate方法創建。提供圖形緩沖區的包裝,以及可用于寫入緩沖區和將其內容呈現到輸出設備的方法。通過Graphics屬性提供對Graphics對象的訪問(即訪問一系列的Draw方法,即可在緩沖區中進行繪制操作),Render()方法用來將圖形緩沖區的內容寫入到與緩沖區關聯的區域。 ??????? 因此實現在緩沖區繪制圖形并且最終顯示到屏幕上的目標控件中可通過如下代碼: //獲得分配和管理圖形的緩沖區(該應用程序域的主緩沖區) BufferedGraphicsContext current = BufferedGraphicsManager.Current; //創建用于緩沖區繪制的對象myBuffer,像素格式為pictureBox.CreateGraphics,大小和pictureBox一致 //這里我們假設緩沖區圖像最終是顯示到pictureBox中的 BufferedGraphics myBuffer = current.Allocate(pictureBox.CreateGraphics(),pictureBox.DisplayReactangle); //和之前的想法一致,DrawImage用以消除繪制過程中的多余軌跡,DrawLine進行繪制操作(以直線為例) myBuffer.Graphics.DrawImage(_bitmapTemp,0,0); myBuffer.Graphics.DrawLine(new Pen(Color.Red),ptLast.X,ptLast.Y,e.X,e.Y); //將緩沖區的圖片綁定至pictureBox,最終顯示在屏幕上 myBuffer.Render(pictureBox.CreateGraphics()); //釋放系統資源 myBuffer.Dispose();


轉載于:https://my.oschina.net/u/1017232/blog/116273

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[Winodows图形编程]初识双缓冲技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。