乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       wfsy1983 2010-09-16

      Windows用戶界面編程中的界面閃爍問題
      南京千里獨行版權所有轉載請保留本信息

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

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

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

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

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

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

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

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

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

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

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多