电竞比分网-中国电竞赛事及体育赛事平台

分享

測(cè)井曲線繪圖顯示算法總結(jié)——雙緩沖技術(shù)

 我愛(ài)土豆絲352 2020-03-12

復(fù)雜的開(kāi)發(fā)測(cè)井工程圖件因含有大量的圖像元素,要經(jīng)過(guò)大量的比例關(guān)系換算、坐標(biāo)系的轉(zhuǎn)換和復(fù)雜的坐標(biāo)映射才能將像素在正確的位置顯示出來(lái)。巨幅、需滾屏顯示的測(cè)井曲線,其運(yùn)算量更大,如按常規(guī)滾屏的方法直接在應(yīng)用程序的窗口繪制全圖,由于開(kāi)始繪制曲線像素所需的大量圖元計(jì)算時(shí)間和結(jié)束像素繪制時(shí)間之間有一個(gè)延遲,而經(jīng)常會(huì)出現(xiàn)圖像的刷新速度慢、圖像重疊和閃爍、花屏等現(xiàn)象。應(yīng)用雙緩沖技術(shù),首先在內(nèi)存中繪制整個(gè)測(cè)井曲線,在滾屏顯示過(guò)程中將內(nèi)存中相應(yīng)位塊的圖像剪貼到顯示區(qū)域,就能克服上述問(wèn)題,連續(xù)地顯示曲線,進(jìn)而將內(nèi)存中的設(shè)備相關(guān)圖像轉(zhuǎn)換成設(shè)備無(wú)關(guān)的、標(biāo)準(zhǔn)格式的圖像進(jìn)行保存。

在Windows中,應(yīng)用程序在下面情況下會(huì)發(fā)出WM_PAINT消息請(qǐng)求繪圖:

(1)當(dāng)創(chuàng)建窗體或改變窗體大小時(shí);

(2)在程序中使用Invalidate等函數(shù)來(lái)指定更新區(qū)域時(shí);

(3)執(zhí)行其它會(huì)影響客戶區(qū)的操作時(shí);

Windwos接收WM_PAINT消息后,就會(huì)執(zhí)行OnPaint函數(shù)進(jìn)行窗口的重繪工作,Windows自身所提供的繪圖機(jī)制中,重繪窗口分兩步進(jìn)行:首先,Windows要發(fā)送WM_ERASEBKGND消息到窗口來(lái)通知窗口擦除背景,當(dāng)窗口接收到WM_ERASEBKGND消息后,會(huì)調(diào)OnEraseBkgnd函數(shù)來(lái)進(jìn)行處理,這會(huì)導(dǎo)致用窗口的背景色填充整個(gè)窗口。上述背景重繪之后,接著實(shí)現(xiàn)窗口圖形的重繪。如果不斷有WM_PAINT消息請(qǐng)求繪圖,就總會(huì)有窗口背景重繪和圖形重繪交替出現(xiàn)。即造成屏幕圖形閃爍有兩種情況,屏幕背景刷新與測(cè)井圖形刷新。

(1)針對(duì)背景刷新引起的閃爍,采用了不進(jìn)行背景重繪的方法來(lái)消除。

可以采取如下方法實(shí)現(xiàn)不執(zhí)行系統(tǒng)默認(rèn)的擦除背景操作:

①把系統(tǒng)缺省的背景刷子設(shè)置為NULL,那么窗體就不會(huì)在刷新屏幕時(shí)擦除背景??梢栽谥剌d后窗體的PreCreateWindow函數(shù)中實(shí)現(xiàn)。

②重載OnEraseBkgnd函數(shù),并在實(shí)現(xiàn)該函數(shù)時(shí)不調(diào)用基類(lèi)函數(shù)。

③把默認(rèn)的背景刷修改為NULL,也可以實(shí)現(xiàn)不擦除背景。

(2)針對(duì)測(cè)井圖形刷新造成的屏幕閃爍現(xiàn)象,采用內(nèi)存DC繪圖來(lái)消除屏幕閃爍。

首先是創(chuàng)建內(nèi)存曲線在windows程序中,所有的繪圖操作必須建立在windows的DC(Device Context)基礎(chǔ)上,在調(diào)用GDI(graphic device interface)函數(shù)繪制圖形之前,首先要得到DC。DC是描述繪圖設(shè)備的數(shù)據(jù)結(jié)構(gòu),它可能是實(shí)際的物理繪圖設(shè)備或是偽設(shè)備,它的作用是提供與物理設(shè)備或偽設(shè)備之間的關(guān)系。創(chuàng)建內(nèi)存位圖,首先創(chuàng)建一個(gè)內(nèi)存DC,再創(chuàng)建與顯示DC相兼容的位圖對(duì)象,將位圖選人內(nèi)存DC,再在內(nèi)存上繪制整個(gè)測(cè)井曲線。部分C++代碼如下:

  1. CBitmap bitmap;
  2. CDC memDC;
  3. memDC.CreateCompatibleDC(pDC);
  4. CReet rect;GetClientRect(&rect);
  5. bitmap.CreateCompatibleBitmap(pDC,PicWidth,PicHeight);
  6. CBitmap *pOldBitmap = memDC.SelectObject(&bitmap);
  7. memDC.FillSolidRect(0,0,PicWidth,PicHeight,RealTimDisply.BackColor);
  8. pDC->BitBlt(0,0,PicWidth,PicHeight,&memDC,0,0,SRCCOPY);
  9. memDC.SelectObject(pOldBitmap);
  10. memDC.DeleteDC();


 還可以利用局部重繪法實(shí)現(xiàn)大數(shù)據(jù)量測(cè)井圖形的快速連續(xù)滾動(dòng)顯示

測(cè)井圖形一般幅度很大,當(dāng)?shù)篮芏嗖⑶依L圖深度很長(zhǎng)時(shí),橫向和縱向都不可能在當(dāng)前窗口一次全部顯示出來(lái).如果采用通常的繪圖方法,一次把整幅測(cè)井圖全部繪制出來(lái),由于繪圖數(shù)據(jù)量非常大,繪圖速度很慢,甚至用戶無(wú)法接受.所以必須采用好的繪圖技術(shù),提高繪圖效率。連續(xù)滾動(dòng)顯示是常用的方法,但是必須解決巨幅測(cè)井圖形的繪圖速度問(wèn)題。

(1)整幅圖形全刷新的方法實(shí)現(xiàn)滾動(dòng)存在的問(wèn)題

為了解決屏幕閃爍問(wèn)題,前面采用了內(nèi)存DC繪圖的技術(shù)。那么,如果采用一般的、也是最容易實(shí)現(xiàn)的滾動(dòng)顯示方案,就是每次滾動(dòng)都重新繪制整幅圖形,即:全刷新的方法。具體是:先根據(jù)實(shí)際測(cè)井圖形的大小,在內(nèi)存中把整幅圖都繪制出來(lái),每次滾動(dòng)時(shí),都重新繪制整幅圖形,然后根據(jù)采用的映射方式,把整幅圖拷貝到屏幕?,F(xiàn)假設(shè)當(dāng)前映射方式下X坐標(biāo)向右為正,Y坐標(biāo)向上為正,那么不管當(dāng)前滾動(dòng)條的位置在哪兒,只要把內(nèi)存中的圖形左上角對(duì)應(yīng)屏幕坐標(biāo)的(0,0)點(diǎn)進(jìn)行拷貝,就可以實(shí)現(xiàn)滾動(dòng)顯示。如果繪制的圖形幅度較小,這種方法實(shí)現(xiàn)比較容易,也能滿足要求。但是測(cè)井圖形一般很大,每次都繪整幅圖形,繪圖速度會(huì)很慢,而且由于圖形大,開(kāi)辟的內(nèi)存也大,會(huì)出現(xiàn)嚴(yán)重的內(nèi)存不足問(wèn)題。所以實(shí)際開(kāi)發(fā)中一般不采用。

(2)只刷新當(dāng)前屏幕的方法實(shí)現(xiàn)滾動(dòng)顯示

只刷新當(dāng)前屏幕的方法是指每次滾動(dòng)都根據(jù)當(dāng)前滾動(dòng)條的位置,計(jì)算屏幕應(yīng)該顯示圖形的哪部分,然后在內(nèi)存中繪出圖形,并拷貝到當(dāng)前屏幕客戶區(qū)。這種方法每次只需要繪制當(dāng)前屏幕客戶區(qū)一樣大小的圖形,這樣一方面減少了每次滾動(dòng)時(shí)繪圖的數(shù)據(jù)量,提高了繪圖速度,同時(shí)由于只繪制和屏幕一樣大小的圖形,所以占用的內(nèi)存也小了,提高了繪圖效率。這種方法比整幅圖形刷新效率高很多,但是,每次刷新必須準(zhǔn)確計(jì)算當(dāng)前屏幕圖形在整幅圖形中的位置。

(3)局部重繪的方法實(shí)現(xiàn)快速連續(xù)滾動(dòng)顯示

只刷新當(dāng)前屏幕的方法在一些情況下可以應(yīng)用,但是當(dāng)測(cè)井圖形復(fù)雜,數(shù)據(jù)量很大時(shí),仍然存在繪圖速度慢的問(wèn)題,如繪制聲電成像測(cè)井圖。而采用局部重繪的方法每次只繪制新滾入屏幕的部分,可以進(jìn)一步減少繪圖工作量,提高繪圖速度,這種方法由于每次刷新重繪的面積小,繪圖占用的內(nèi)存也少,效率很高。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(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)論公約

    類(lèi)似文章 更多