999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于雙緩存技術解決某模擬系統實時顯示屏幕閃爍的方法

2008-12-31 00:00:00周燕明崔衛兵
電腦知識與技術 2008年25期

摘要:本文基于雙緩存技術,對某模擬系統實時圖形繪制和實時數據顯示時,屏幕閃爍難題的一種解決方法進行了探索。分析了計算機顯示的原理,闡述了雙緩存技術的實質、運用步驟和注意事項,并在Windows操作系統和Visual C++6.0開發平臺上,通過實例編程、上機試驗,檢驗了該方法的有效性。

關鍵詞:雙緩存;實時顯示;屏幕閃爍;方法

中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)25-1574-03

One Way Based on Double Buffer Memory Technology to Solve Some Simulator Real-time Display Screen Flickering

DONG Yan, ZHOU Yan-ming, CUI Wei-bing

(Department of Science and Technology, College of Chinese PLA Artillery, Hefei 230031, China)

Abstract: Based on double buffer memory technology, the paper studies one way to solve some simulator screen flicker upon real-time protracting figure and real-time displaying data. After analyzing computer display theory, it expounds double buffer memory technological substance, application steps and notices, and proves validity of this method through programming, testing an example, utilizing Windows operation system and Visual C++ 6.0 exploit platform.

Key words: double buffer memory; real-time display; screen flickering; method

1 引言

某模擬系統的模擬對象之一是監視雷達天線,其掃描周期為1秒或1.5秒,也就是說雷達天線每轉一圈,探測數據和探測數據曲線至少要在1秒之內,刷新終端顯示器1次,這就對模擬系統的數據處理模塊程序提出了很高的要求。如何實現實時圖形繪制和實時數據顯示,并解決屏幕閃爍的難題,是該模擬系統軟件開發要重點解決的關鍵問題之一。

在屏幕顯示區域,要實時顯示探測數據,并要實時繪制和顯示圖形,如果直接在屏幕上動態繪圖,屏幕就會明顯的閃爍。這是因為圖形繪制過程,可分為繪制、擦除、重繪三個階段[1],其中擦除窗口顯示區的操作是必須的,而在新的圖形繪制出之前,在極短時間內,屏幕呈現的是一個空的顯示區域,完成圖形重繪后,窗口顯示區中才開始有內容顯示,如果擦除和重繪的操作間隔時間過長,就會出現閃爍,這就是造成屏幕閃爍的根本原因。使用雙緩沖技術可有效的防止這種閃爍現象。下面首先簡要介紹計算機顯示原理和雙緩存技術。

2 計算機顯示原理

計算機顯示系統的核心是視頻內存。該內存包含有代表顯示圖案的數據,而這些圖案顯示在顯示器上。每一個圖形操作都會影響視頻內存,因為GDI[2](Graphic Device Interface)執行計算后,以相應的方式更改視頻內存,即顯示在屏幕上。

相對于視頻內存的位圖內存,二者區別在于,位圖內存是看不到的,而視頻內存可以看到。位圖代表類似于視頻內存的RAM區域,由于它們都代表一個容納數據的內存地址,因此二者又是相似的。由位圖分配的RAM代表一個矩形。在Windows API[3]中,所分配內存的句柄被稱為HBITMAP。數據駐留在此內存中,一旦被移動到視頻內存中,就顯示在顯示器上。例如:一個桌面圖標,圖標從磁盤加載到內存中,然后內存被移動到視頻內存的恰當位置,這樣當視頻內存通過視頻硬件被顯示到屏幕上時,圖標則可見。

位圖以不同于諸如繪制直線或橢圓這樣的對象的方式,將圖形對象添加到屏幕上。直線和橢圓是以數學方法計算,然后按照對象顯示方式設置視頻內存中的象素。位圖數據不用計算,圖案已經存在于位圖內存中。只需要將存儲塊從位圖內存拷貝到視頻內存中即可。因此,當最終結果是一個復雜的圖形時,使用位圖比使用一系列繪圖操作要好的多。例如:在屏幕上繪制你的照片需要執行很多次獨立操作,可能是成千上萬,但是通過使用位圖,復雜照片可以駐留在位圖內存中,然后只需要執行一次拷貝操作,位圖內存就可以被快速的復制到視頻內存的一個區域中,這樣照片就可以顯示在屏幕。

當程序繪制窗口需要多次調用GDI時,在窗口擦除并被重新繪制的過程中,會出現明顯的屏幕閃爍。這是由于Windows操作系統在每次重新繪制窗口時,首先要用指定的背景色來擦除當前窗口的內容,然后再把新的窗口內容繪制上去。使用雙緩存技術可以解決屏幕閃爍。

3 雙緩存技術

在計算機系統中,緩存[4]就是一個開辟用來保存數據的臨時空間,使用緩存,就不需要頻繁的訪問存儲在內存或硬盤中的數據,當執行一個或一系列的操作,并且將操作結果放入緩存后,就可以迅速的訪問這些數據。

3.1 雙緩存技術的實質

雙緩存技術就是先在內存(不可見緩存)中操作,然后再把操作結果拷貝到屏幕內存(可見內存)中進行顯示的技術。應用雙緩存技術實時顯示圖形,觀察到的是圖形操作的結果,而不是圖形的繪制過程。

該技術涉及到兩個設備上下文(Device Context,簡稱DC):屏幕DC和內存DC。所謂設備上下文[5](DC)就是一種Windows數據結構,它包括了一個設備(如顯示器)繪制屬性的相關信息。把所有要繪制的內容先在內存DC中進行繪制,而后全部拷貝到屏幕DC中,從而把所有瑣碎的繪制過程都在內存DC中完成,用戶在屏幕上看到的就是一個完成的圖形。關鍵就是這個圖形,這個圖是從屏幕DC中創建的,該圖的尺寸就是客戶區域的大小,之后,把該圖選入內存DC中,然后在內存DC中繪制的動作都是在這個圖中進行的,最后把內存DC中,這幅已經繪制好的圖形再選入到屏幕DC中,即顯示出來。

3.2 應用雙緩存技術的一般步驟

運用雙緩存技術一般可以分為六個步驟:

1) 利用CDC類的成員函數CreateCompatibleDC()創建關于屏幕的內存DC;

2) 創建一幅關于屏幕DC的圖形,注意把握rect的尺寸為客戶區域大小;

3) 利用CDC類的成員函數SelectObject()將這幅畫選入內存DC中;

4) 在內存DC中進行任何繪制動作;

5) 繪制完成后,利用CDC類的成員函數BitBlt()或StretchBlt()將內存DC中的這幅圖拷貝到屏幕DC中來;

6) 進行相關的資源回收動作,以免造成內存泄漏。

3.3 應用雙緩存技術的注意事項

在運用雙緩存技術的過程中,如果系統頻繁刷新背景,將會直接影響屏幕的實時顯示。因此,必須強制要求系統不刷新背景,從而加快顯示速度。具體做法是重載系統的ON_WM_ERASEBKGND消息響應函數,令其返回值始終為FALSE。

另外,調用刷新函數Invalidate會導致整個窗口的圖形重繪,需要的時間較長,而函數InvalidateRect()只重繪Rect結構所指的矩形區域,所需的時間會少一些。因此在刷新時,采用只刷新指定區域的方式,以減少計算量。

4 基于雙緩存技術的實時曲線繪制和數據顯示

4.1 開發環境

1) 操作系統:Windows;

2) 開發平臺:Visual C++ 6.0。

4.2 關鍵代碼

//創建內存繪圖區

m_dcCompatible.CreateCompatibleDC(pdc);

m_bitmap.CreateCompatibleBitmap(pdc,rect.Width(),13*rect.Height());

m_dcCompatible.SelectObject(m_bitmap);

m_bitmap.GetBitmap(m_bmp);

以球坐標數據和球坐標曲線的實時繪制為例說明在內存DC中的繪制動作:

void CJsDlg::OnSetTextQ()

{

……

CDC *pDC=m_dcCompatible;//定義CDC類對象

//////////實時顯示球坐標數據

for(int j=0;j<=qi;j++)

{pDC->TextOut(m_RulerWidth,tm.tmHeight+j*tm.tmHeight,Qd[j][0]);

pDC->TextOut(m_RulerWidth+90,tm.tmHeight+j*tm.tmHeight,Qd[j][1]);

……

}

……

//////////實時繪制球坐標曲線

for(int i=0;i<=qi;i++)

{

int y=3*rect.Height()-rect.Height()/10*2-(i+1)*Qperheight-8;

pDC->SetPixel(zeroscaleYj+(int)(Qsj[i][0]*perscaleYj),y,RGB(0,0,255));

//仰角曲線

pDC->SetPixel(zeroscaleFwj+(int)(Qsj[i][1]*perscaleFwj),y,RGB(0,255,0));

//方位角曲線

pDC->SetPixel(zeroscaleXj+(int)((Qsj[i][2]*perscaleXj)/1000),y,RGB(255,0,0));

//斜距曲線

}

……

}

繪制完后利用CDC類的成員函數StretchBlt()將內存DC中的這幅圖繪制到屏幕DC中來。這里自定義成員函數DrawPages()實現這一功能。

void CJsDlg::DrawPages()

{

pdc->StretchBlt(0,-m_vScrollBar_Pos*rect.Height()/m_PageSize,rect.Width(),

rect.Height(),m_dcCompatible,0,0,m_bmp.bmWidth,m_bmp.bmHeight/13,

SRCCOPY);

pdc->StretchBlt(0, rect.Height()-m_vScrollBar_Pos*rect.Height()/m_PageSize, rect.Width(),

rect.Height(),m_dcCompatible,0,rect.Height(),m_bmp.bmWidth,m_bmp.bmHeight/13,

SRCCOPY);

pdc->StretchBlt(0,2*rect.Height() - m_vScrollBar_Pos*rect.Height()/m_PageSize,

rect.Width(),rect.Height(),m_dcCompatible,0,2*rect.Height(),m_bmp.bmWidth,

m_bmp.bmHeight/13,SRCCOPY);

……

}

4.3 程序實現

如圖1和圖2所示,分別為實時數據顯示和實時曲線顯示效果圖。在程序運行的顯示過程中,可以明顯的感受到運用雙緩存技術后,解決了屏幕閃爍的問題,實時曲線繪制和實時數據顯示流暢。

圖1 實時數據的顯示圖2 實時曲線的顯示

5 結束語

在軟件開發的過程中,實現數據和圖形的顯示比較簡單,但是要實現實時的圖形繪制和實時的數據顯示,同時避免屏幕的閃爍卻并不容易,本文經過理論分析、實例驗證,提供了一種基于雙緩存技術解決實時顯示屏幕閃爍的有效方法。

參考文獻:

[1] 孫家廣. 計算機圖形學[M]. 3版. 北京:清華大學出版社,2003.

[2] Mahesh Chand. GDI+圖形程序設計[M]. 北京:電子工業工業出版社,2005.

[3] 楊旭, 沈大林, 沈昕, 等. Visual C++ 6.0編程篇[M]. 北京:電子工業出版社,2004.

[4] 潘云鶴. 計算機圖形學原理、方法及應用[M]. 北京:高等教育出版社,2002.

[5] 朱晴婷, 黃海鷹, 陳蓮君. Visual C++程序設計[M]. 北京:清華大學出版社,2005.

主站蜘蛛池模板: 国产麻豆91网在线看| 99九九成人免费视频精品| 狠狠操夜夜爽| 午夜国产大片免费观看| 日本一本正道综合久久dvd| 日韩午夜福利在线观看| 亚亚洲乱码一二三四区| 亚洲高清无码精品| 国产成人久久777777| 亚洲高清中文字幕| 中文字幕自拍偷拍| 真实国产精品vr专区| 久久五月视频| 999精品在线视频| 2022精品国偷自产免费观看| 午夜无码一区二区三区| 亚洲国产成熟视频在线多多| 国产欧美日韩18| 亚洲熟女中文字幕男人总站| 国产精品刺激对白在线| 久久精品亚洲中文字幕乱码| 成人午夜视频在线| 久久96热在精品国产高清| 国产午夜精品鲁丝片| 亚洲午夜18| 国产女人在线视频| 日日拍夜夜操| 亚洲一级毛片在线观播放| 国产黑丝视频在线观看| 91激情视频| 精品成人免费自拍视频| 免费人成在线观看视频色| 91久久偷偷做嫩草影院电| 国产乱子伦手机在线| 欧美视频二区| 欧美精品v日韩精品v国产精品| 欧美亚洲另类在线观看| Jizz国产色系免费| 六月婷婷精品视频在线观看| 精品国产污污免费网站| 国产精品hd在线播放| 国产一区三区二区中文在线| 亚洲天堂伊人| 四虎精品免费久久| 不卡无码网| 国产精品爽爽va在线无码观看| 国产成a人片在线播放| 一级黄色网站在线免费看 | 国产成人亚洲无吗淙合青草| 激情无码字幕综合| 国产精品人莉莉成在线播放| 色婷婷丁香| 亚洲人成日本在线观看| 亚洲精品大秀视频| 亚洲天堂网在线观看视频| 久久精品无码国产一区二区三区| 国产精品综合色区在线观看| 亚洲中文字幕无码爆乳| 午夜丁香婷婷| 欧美在线三级| 91视频精品| 不卡无码h在线观看| 国产主播在线观看| 欧美精品亚洲精品日韩专| 午夜精品久久久久久久2023| 国产一区二区三区精品欧美日韩| 日本高清免费一本在线观看| 女人爽到高潮免费视频大全| 天天操天天噜| www.狠狠| 亚洲最大情网站在线观看| 国产色图在线观看| 无码日韩人妻精品久久蜜桃| 亚洲精品日产AⅤ| 亚洲第一视频免费在线| 免费不卡在线观看av| 久久这里只精品热免费99 | 97se亚洲| 亚洲一区二区日韩欧美gif| 成人自拍视频在线观看| 亚洲黄色成人| www.99精品视频在线播放|