小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Windows用戶界面編程中的界面閃爍問題 - 千里獨(dú)行 - 博客園

 wfsy1983 2010-09-16

Windows用戶界面編程中的界面閃爍問題
南京千里獨(dú)行版權(quán)所有轉(zhuǎn)載請(qǐng)保留本信息

    在Windows圖形化用戶界面編程中,若程序自己繪制用戶界面時(shí),會(huì)經(jīng)常碰到界面閃爍,比如其他窗口在上面移動(dòng),用戶界面滾動(dòng),這些都有可能導(dǎo)致閃爍。在一個(gè)容器中繪制特定的文檔,需要相應(yīng)作為繪圖容器的控件的OnPaint事件,需要在OnPaint事件處理中重新繪制文檔,而Windows操作系統(tǒng)一般會(huì)在兩種情況下觸發(fā)OnPaint事件:容器控件被其他窗體覆蓋后又顯示,還有就是容器控件的滾動(dòng)處理。在這些情況下,Windows操作系統(tǒng)會(huì)頻繁的觸發(fā)OnPaint事件,而應(yīng)用程序會(huì)頻繁的在繪圖容器中重新繪制圖形,若應(yīng)用程序沒有進(jìn)行很好的優(yōu)化,則很有可能導(dǎo)致用戶界面閃爍。

   用戶界面出現(xiàn)閃爍自然害處多多,首先它使得你的程序看起來不專業(yè),甚至有不穩(wěn)定的嫌疑,對(duì)于追求完美的你這么會(huì)容許它的存在呢;其次閃爍會(huì)損害用戶的視力,容易讓用戶產(chǎn)生視覺疲勞。

    好了,廢話我不多說了,我們就來發(fā)現(xiàn)問題,分析問題,解決問題。

    首先說說閃爍的本質(zhì),說到本質(zhì),就不得不提一些計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)和Windows圖形用戶子系統(tǒng)的一些知識(shí)。我們知道,在計(jì)算機(jī)內(nèi)存中有一個(gè)區(qū)域叫做顯存,而顯卡則每過一些毫秒就從掃描顯存,然后根據(jù)操作顯示器來繪制一個(gè)個(gè)象素,因此每過一些毫秒顯示器顯示的內(nèi)容就會(huì)重新設(shè)置一遍,由于這是硬件操作,非???,若畫面內(nèi)容沒有變化,則人類肉眼是看不到這個(gè)刷新的,此時(shí)用戶界面是沒有任何閃爍。

    右圖就是應(yīng)用程序繪制用戶界面的原理,應(yīng)用程序在CPU的支持下向顯存填充數(shù)據(jù),而以此同時(shí)顯卡也從顯存加載數(shù)據(jù)操作顯示器繪制圖形,(筆者想若應(yīng)用程序能直接訪問顯示器則繪制速度不要太快哦),而用戶界面閃爍也就根源于這種顯示結(jié)構(gòu)。前面提到,顯卡每過一些毫秒就會(huì)掃描顯存,刷新顯示器的顯示。假設(shè)有個(gè)顯示卡,設(shè)置其刷新頻率為50赫茲,則它每20毫秒就掃描顯存刷新顯示器,而顯卡的操作和應(yīng)用程序的操作之間沒有任何關(guān)系,顯卡是自帶處理器的,于是應(yīng)用程序和顯卡這兩個(gè)對(duì)象同時(shí)操作顯存,顯卡只讀取顯存,而應(yīng)用程序則修改顯存,這就導(dǎo)致了類似多線程程序的數(shù)據(jù)同步的問題了。但這時(shí)硬件結(jié)構(gòu)決定此時(shí)沒有什么鎖定機(jī)制可使用。顯卡每20毫秒就進(jìn)行刷新操作,連操作系統(tǒng)也擋不住,而且應(yīng)用程序根本不知道顯卡會(huì)何時(shí)進(jìn)行刷新操作。

    某個(gè)時(shí)刻,應(yīng)用程序需要繪制用戶界面,首先需要清空繪制容器,因此將顯存一大片區(qū)域設(shè)置為白色,應(yīng)用程序剛完成了清空操作,還每來得及繪制內(nèi)容時(shí),顯卡就刷新了,很快顯示器上顯示了一大片白色。同時(shí),應(yīng)用程序開始繪制內(nèi)容,應(yīng)用程序運(yùn)行緩慢,它化了20毫秒繪制了文檔的上半身,文檔上半身主要為紅色,剛繪制了上半身,顯卡就好不留情的進(jìn)行刷新,很快顯示器上顯示了一半的文檔,剛才一半的白色大半變成了紅色,此時(shí)用戶看來,顯示器一下變成一片白,然后很快一半變成紅色,此時(shí)顯示器內(nèi)容產(chǎn)生了兩次大面積的內(nèi)容變幻,然后應(yīng)用程序又化了20毫秒顯示了文檔的下半身,文檔下半身主要為綠色,此時(shí)顯卡進(jìn)行刷新,顯示器上另一半還殘存的白色又變成綠色。由于應(yīng)用程序繪制文檔完畢,因此不再修改顯存,此時(shí)顯示器的顯示的內(nèi)容不再發(fā)生改變。

    在上面的描述中,顯示器首先從花花綠綠變成一片白,20毫秒后一半變成紅色,又20毫秒后另一半變成綠色,如此大面積的顯示內(nèi)容短期的改變就是所謂的閃爍,此時(shí)計(jì)算機(jī)顯示器就是在折磨用戶的眼睛。

    其實(shí)從廣義上說,計(jì)算機(jī)顯示器顯示的內(nèi)容頻繁的發(fā)生大面積的改變都是考驗(yàn)人類的眼睛。有些人玩一些激烈的3D游戲,比如雷神CS之類的,若玩的時(shí)間長(zhǎng)點(diǎn)眼睛就受不了。就是因?yàn)檫@些游戲程序?qū)е嘛@示器顯示的內(nèi)容頻繁的發(fā)生大面積的改變。因此游戲程序也算導(dǎo)致用戶界面閃爍。只不過這種閃爍不算難受。

    通過上面的討論,知道了閃爍的根源,于是我們發(fā)現(xiàn)了問題,并分析了問題,現(xiàn)在解決問題。在目前的計(jì)算機(jī)結(jié)構(gòu)中,我們的應(yīng)用程序只能通過填充顯存來繪制用戶界面,在這種情況下,對(duì)付閃爍的不二法則就是快,應(yīng)用程序要非??斓男薷娘@存。對(duì)于每20毫秒進(jìn)行刷新操作的顯卡,若我們的應(yīng)用程序能在20毫秒內(nèi)修改顯存完畢,則在很多情況下顯卡就只會(huì)導(dǎo)致顯示器顯示的內(nèi)容發(fā)生改變,減少閃爍,應(yīng)用程序填充顯存前后顯存的數(shù)據(jù)進(jìn)行對(duì)比,若數(shù)據(jù)前后不一致的字節(jié)數(shù)越少,顯示器中刷新操作前后顏色發(fā)生改變的象素?cái)?shù)就越少,這用戶界面的閃爍就越小。

    提高應(yīng)用程序修改顯存的速度的方法有很多中,而且Windows操作系統(tǒng)為我們做了許多底層的操作。我們知道若一個(gè)窗體被覆蓋后又顯示了,則Windows操作系統(tǒng)就會(huì)向該窗體發(fā)送重繪消息,而且還會(huì)傳一個(gè)矩形數(shù)據(jù),該矩形表示窗體中需要刷新的區(qū)域,應(yīng)用程序可以根據(jù)這個(gè)矩形來重新繪制文檔的某個(gè)部分,這樣就不必要繪制所有的內(nèi)容,提高繪制速度,減少繪制時(shí)間,這就需要進(jìn)行繪圖代碼的優(yōu)化。

   在某些情況下,繪圖速度很難優(yōu)化起來,此時(shí)可以采用所謂“雙緩沖”的技術(shù)來減少閃爍,應(yīng)用程序可以在內(nèi)存中創(chuàng)建一個(gè)和屏幕相兼容的圖形設(shè)備上下文。該上下文實(shí)際上處理一個(gè)保存在內(nèi)存中的BMP圖片對(duì)象,這樣就容許應(yīng)用程序緩慢地在這個(gè)BMP上繪制圖形。應(yīng)用程序繪制完畢,就用WIN32API函數(shù)BitBlt來將BMP圖片填充到顯存中,BitBlt函數(shù)速度非???,足以在屏幕的刷新周期內(nèi)完成繪圖,這樣能基本上避免閃爍。但雙緩沖也有缺點(diǎn),首先增加程序復(fù)雜度,其次要消耗一些內(nèi)存,還有它讓整個(gè)繪圖時(shí)間變長(zhǎng),導(dǎo)致用戶進(jìn)行滾動(dòng)時(shí)會(huì)產(chǎn)生“界面沉重感”,有“慣性”,此外還讓人偷懶而不注意繪圖操作的優(yōu)化。

      俗話說,說得容量做到難,編程也一樣,本文中對(duì)付閃爍的說的輕巧,但在實(shí)際編程中,閃爍一直是圖形化用戶界面編程的老大難問題,需要精心的設(shè)計(jì)程序結(jié)構(gòu),優(yōu)化代碼,提高速度。這需要靠很多的理論知識(shí)和深厚的編程功底,這些需要長(zhǎng)期的編程實(shí)踐。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多