一、背景
在做C/S項(xiàng)目中,做好的窗體出現(xiàn)了頁面加載控件緩慢,放大、縮小窗體之后,窗體加載卡頓,以及數(shù)據(jù)渲染緩慢。
二、可以利用雙緩沖技術(shù)去解決這個(gè)問題。那么什么是雙緩沖?
百度介紹:我們看電視時(shí),看到的屏幕稱為OSD層,也就是說,只有在OSD層上顯示圖像我們才能看到。現(xiàn)在,我需要?jiǎng)?chuàng)建一個(gè)虛擬的、看不見但是可以在上面畫圖(比如說畫點(diǎn)、線)的OSD層,我稱之為offscreen(后臺(tái)緩沖區(qū))。這個(gè)offscreen存在于內(nèi)存中,我們在上面畫圖,這個(gè)offscreen上面的東西可以顯示在OSD層上,需要一個(gè)創(chuàng)建這個(gè)offscreen的函數(shù),返回這個(gè)offscreen的句柄(整型指針)、寬度、高度、指向新建offscreen數(shù)據(jù)緩沖區(qū)的指針,該緩沖區(qū)是一個(gè)在函數(shù)外創(chuàng)建的offscreen的數(shù)據(jù)緩沖區(qū),大小是offscreen的高度*寬度*每個(gè)像素點(diǎn)數(shù)據(jù)的大小。閃爍是圖形編程的一個(gè)常見問題。需要多重復(fù)雜繪制操作的圖形操作會(huì)導(dǎo)致呈現(xiàn)的圖像閃爍或具有其他不可接受的外觀。雙緩沖的使用解決這些問題。雙緩沖使用內(nèi)存緩沖區(qū)來解決由多重繪制操作造成的閃爍問題。當(dāng)啟用雙緩沖時(shí),所有繪制操作首先呈現(xiàn)到內(nèi)存緩沖區(qū),而不是屏幕上的繪圖圖面。所有繪制操作完成后,內(nèi)存緩沖區(qū)直接復(fù)制到與其關(guān)聯(lián)的繪圖圖面。因?yàn)樵谄聊簧现粓?zhí)行一個(gè)圖形操作,所以消除了由復(fù)雜繪制操作造成的圖像閃爍。
總而言之:在計(jì)算機(jī)中,動(dòng)畫被視為一種變化的圖像序列,由一幀一幀的動(dòng)態(tài)圖像組成,這些圖像隨著時(shí)間的改變而改變,后一幀圖像是對前一幀圖像所作的修改。
在單緩沖動(dòng)畫中,圖形直接繪制在顯示緩沖區(qū),如果顯示后一幀圖像,必須擦除屏幕,所以在制作過程中需要不斷擦除屏幕,這也是屏幕閃爍(窗體加載緩慢)的原因。雙緩沖動(dòng)畫有兩個(gè)緩沖區(qū),除了有顯示緩沖區(qū)外,還有內(nèi)存緩沖區(qū),在制作過程中首先把圖形繪制在內(nèi)存緩沖區(qū)中,然后講內(nèi)存緩沖區(qū)中的圖像一次性拷貝到心事緩存區(qū),顯示緩沖區(qū)只是作為內(nèi)存緩沖區(qū)的一個(gè)映像。
舉例:
投影儀和白板。但緩沖動(dòng)畫:在使用白板的時(shí)候,如果寫滿了,需要寫下一頁,那么我只能把白板上的內(nèi)容擦除掉,再去寫內(nèi)容。雙緩沖動(dòng)畫:投影儀的時(shí)候是需要需要換內(nèi)容,我直需要把投影儀中的內(nèi)容進(jìn)行修改即可,避免擦除操作。
三、具體方法(代碼展示)
1、 C# winform窗體卡頓的解決辦法
哪個(gè)窗體需要修改頁面卡頓,加入此方法
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
該方法是可以解決頁面上所有控件加載慢的方法。
在上面的代碼中,有用到CreateParams 類,它是具體解決卡頓、閃屏的問題。查閱資料:窗體和控件的屬性CreateParams,通過它你能夠很方便的控制窗體或控件諸如邊框、最大化、最小化關(guān)閉,按鈕的隱藏、窗體的模式化,彈窗模式等的一些特性
2、那么針對dataGridView加載數(shù)據(jù)慢,不流暢的現(xiàn)象也可以用以下方法。根源上也是利用了雙緩沖技術(shù)。
需要在窗體所對應(yīng)的構(gòu)造構(gòu)造函數(shù)中寫入以下代碼,控制DataGridView加載數(shù)據(jù)延遲的問題。
this.SetStyle(ControlStyles.OptimizedDoubleBuffer //雙緩沖
| ControlStyles.ResizeRedraw
| ControlStyles.AllPaintingInWmPaint, //不擦除背景,減少閃爍
true);
this.UpdateStyles();
//利用反射設(shè)置DataGridView的雙緩沖
Type dgvType = this.dgvwCustomerManagement.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(this.dgvwCustomerManagement, true, null);
四、總結(jié)
雙緩沖技術(shù)是一種用于圖形界面繪制的優(yōu)化技術(shù),通過使用兩個(gè)緩沖區(qū)來減少圖像閃爍和提高繪制效率。以下是對雙緩沖技術(shù)的總結(jié):
1. 原理:雙緩沖技術(shù)使用兩個(gè)緩沖區(qū),一個(gè)用于繪制圖像,一個(gè)用于顯示圖像。繪制圖像在后臺(tái)緩沖區(qū)進(jìn)行,完成后再將整個(gè)圖像一次性地繪制到前臺(tái)緩沖區(qū),從而避免了圖像閃爍。
2. 優(yōu)點(diǎn):使用雙緩沖技術(shù)可以提高圖形界面的繪制效率和用戶體驗(yàn)。由于繪制操作在后臺(tái)進(jìn)行,用戶可以看到一個(gè)完整的圖像,而不是逐個(gè)元素的繪制過程。這樣可以減少圖像閃爍,并提高用戶對界面的感知。
3. 實(shí)現(xiàn)方式:實(shí)現(xiàn)雙緩沖技術(shù)可以使用各種編程語言和圖形庫。一種常用的方式是使用雙緩沖繪圖對象,將繪制操作指向后臺(tái)緩沖區(qū),然后將整個(gè)后臺(tái)緩沖區(qū)繪制到前臺(tái)緩沖區(qū)。
4. 應(yīng)用場景:雙緩沖技術(shù)適用于需要頻繁繪制圖形界面的場景,如圖形編輯器、游戲界面等。在這些場景中,使用雙緩沖可以提高繪制效率和用戶體驗(yàn),減少圖像閃爍。
5. 注意事項(xiàng):在使用雙緩沖技術(shù)時(shí),需要注意內(nèi)存消耗和性能開銷。由于使用了兩個(gè)緩沖區(qū),可能會(huì)增加內(nèi)存占用。同時(shí),由于每次繪制都需要將整個(gè)后臺(tái)緩沖區(qū)繪制到前臺(tái)緩沖區(qū),可能會(huì)增加繪制的時(shí)間和CPU開銷。文章來源:http://www.zghlxwxcb.cn/news/detail-432062.html
總之,雙緩沖技術(shù)是一種用于圖形界面繪制的優(yōu)化技術(shù),通過使用兩個(gè)緩沖區(qū)來減少圖像閃爍和提高繪制效率。使用雙緩沖技術(shù)可以改善用戶體驗(yàn),特別是在需要頻繁繪制圖形界面的場景中。然而,在使用雙緩沖技術(shù)時(shí)需要注意內(nèi)存消耗和性能開銷。文章來源地址http://www.zghlxwxcb.cn/news/detail-432062.html
到了這里,關(guān)于使用雙緩沖技術(shù)解決winform窗體控件卡頓(dataGridView加載數(shù)據(jù)緩慢)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!