自從米格的仁兄向我推薦c#之后,偶就誤入歧途的漸漸脫離了java陣營。最近在寫工具的時(shí)候,忽然發(fā)現(xiàn)了一個(gè)老生常談的閃爍問題,要知道這樣的問題在java swing里只要把doublebuffer設(shè)置為true基本上是不會(huì)發(fā)生的,但在c#上卻怎么也搞不定,竟然連雙緩沖都有問題,gdi+不會(huì)這么脆弱吧。
偶再一次被微軟的花頭給戲弄了,無奈只好踏上了漫漫搜索之路,也不知道搜了多少帖子,找了多少資料,基本上都是無功而返,更可氣的是網(wǎng)上有些資料還騙人,偶試了試基本上都不行的,該閃的照樣閃的歡。有些方法像臟矩陣一樣要invalide部分更新區(qū)域,偶嫌他麻煩,幸好偶找到了一篇文章,講閃爍原理的,雖然偶過去自認(rèn)為了解閃爍原理,比如什么刷新周期,顯存之類的,不過偶還是耐著性子看了一遍,收獲頗豐,看來孔夫子的溫故而知新頗有道理!
于是偶按照原理自己改起了代碼,沒想到還真讓我給解決了。c#控件之所以會(huì)閃爍,是因?yàn)閞efresh會(huì)把整個(gè)控件給清成背景色,然后再把圖像繪制上去,就算先把所有待畫的圖像繪制到緩沖上,然后再render到控件上,因?yàn)榍迤習(xí)r的顏色,相當(dāng)于中間插了一空白幀,當(dāng)刷新過快時(shí)也是會(huì)有閃爍的。
偶的做法是:
1.每幀控件創(chuàng)建一個(gè)graphics,記得一定是creategraphics而不是通過paint函數(shù)的那個(gè)參數(shù)e獲得。
2.把待繪制的圖像繪制到緩沖上,緩沖大小為控件大小。
3.刷新的時(shí)候調(diào)用invalidate(new rectangle(0, 0, 1, 1));
4.在paint函數(shù)繪制緩沖,搞定!
哈哈,相信大家看了都會(huì)了解,invalidate(new rectangle(0, 0, 1, 1));相當(dāng)于調(diào)用paint函數(shù),但卻不重繪控件,這樣中間那個(gè)空白幀就沒有了,閃爍當(dāng)然就消失啦!
原理很重要啊很重要!
新聞熱點(diǎn)
疑難解答
圖片精選