陳立寧,羅 超,林伯奇,彭 棟
(中國電子科技集團公司第四十八研究所,湖南 長沙 410111)
圖形雙緩沖和GDI+在多靶磁控濺射系統(tǒng)中的應(yīng)用
陳立寧,羅 超,林伯奇,彭 棟
(中國電子科技集團公司第四十八研究所,湖南 長沙 410111)
根據(jù)雙緩沖的原理,利用GDI+中高級圖形處理功能較高地還原磁控濺射工藝的全流程,以動畫的形式實時呈現(xiàn)在UI界面上的全過程。雙緩沖的實現(xiàn)使得用戶在觀察窗狹小的情況下,通過軟件UI界面能實時瀏覽工藝的當前運行進度。
雙緩沖;閃爍;圖形設(shè)備用戶接口
一臺工業(yè)設(shè)備,尤其是大型工藝設(shè)備往往有數(shù)十個甚至數(shù)百個信號、閥門、流量計等多個子部件,工藝流程也越來越復(fù)雜,很多工藝都牽涉到不止一兩個設(shè)備部件的運動,有的甚至有數(shù)十個或上百個機械運動部件,而且還有交叉互鎖配合聯(lián)動控制。部件的運動狀態(tài)以及工藝的實時參數(shù)、控制信號等,這些往往幾乎都是裝置在設(shè)備內(nèi)部,用戶不可能實時觀察得到,因此在計算機軟件界面上實時呈現(xiàn)出設(shè)備及工藝的運行情況,尤其是運動狀態(tài)的話,不僅能夠讓用戶有很好的體驗效果,而且對設(shè)備內(nèi)部的情況有很直觀清晰的了解。
多靶磁控濺射系統(tǒng)的一個最大特點是可以保證工藝的連續(xù)運作,能夠很好地滿足產(chǎn)能。它腔體分為上下兩層,靠一個具有升降功能的雙層基片托盤的基片架阻隔。下層工藝室在運行工藝的同時上層腔體可進行取片和放片,從而達到工藝連續(xù)運作的目的。該設(shè)備內(nèi)部的機械運動部件比較多,包括由液壓泵控制升降的基片架、由伺服電機帶動鏈條傳動從而實現(xiàn)水平運動的載片車以及擋板,還有一個由氣缸帶動升降的清洗臺,共4個運行部件。如果軟件界面上這些部件做成靜態(tài)圖片,用戶將無法了解當前工藝運行進程;如果動態(tài)效果處理不當,造成畫面閃爍或者跳格,都會對用戶的使用體驗造成不好的影響。因此,如何使得畫面動態(tài)效果既平滑又與實際部件保持同步,是工業(yè)軟件編程的一個很重要方面。
1.1 軟件動畫原理及實現(xiàn)
動畫化是將多張不同內(nèi)容的圖片通過快速定位、重繪,利用人眼的視覺殘留效應(yīng),達到由靜止變?yōu)閯討B(tài)的一種特效。軟件中動畫效果的實現(xiàn)包括圖片加載、顏色及透明度處理、圖形渲染、數(shù)字建模及坐標運算等,利用視覺殘留效應(yīng)實現(xiàn)動態(tài)效果。
高級軟件動畫化編程涉及到很多美工設(shè)計,復(fù)雜的數(shù)學(xué)運算等。在工業(yè)軟件上,一般對動畫化要求不高,實現(xiàn)的原理相對也比較簡單,即利用計算機CPU高速的運行速度,通過快速擦除原有位置的圖片,然后在一個新的坐標位置重新繪制圖片,從而實現(xiàn)圖片動態(tài)的效果
1.2 簡單粗糙的軟件動畫實現(xiàn)及弊端
根據(jù)上小節(jié)闡述,軟件中實現(xiàn)動畫的關(guān)鍵步驟一般包括:
(1)準備用于動畫效果的靜態(tài)圖片文件,一般為bmp、png、jpg等各式;
(2)通過動態(tài)或靜態(tài)的方式將圖片加載到源代碼中;
(3)根據(jù)業(yè)務(wù)需求,計算圖片將要實時呈現(xiàn)的位置;
(4)設(shè)置定時器循環(huán),實時刷新界面實現(xiàn)動畫特效。
根據(jù)上述步驟,在軟件中動畫特效的一種比較簡單實現(xiàn)的方式就是,在上述步驟的第2步中,通過圖形控件將圖片靜態(tài)加載到源代碼中。這種方式的優(yōu)點主要在于易實現(xiàn),只需兩步就可以完成:
(1)將控件從IDE軟件的工具箱中拖放至軟件的設(shè)計界面上;
(2)從該控件的屬性表中,將圖片的磁盤存放位置信息設(shè)置到控件的相關(guān)屬性中。
完成以上兩步后,設(shè)計人員不需要另外手工添加任何代碼即可完成對圖片的加載。但是該方式也具有很多弊端:
(1)系統(tǒng)開銷大,運行效率不高;如果有多個畫面要實現(xiàn)動態(tài)特效,就要拖放等量的控件,而每個控件都有諸多屬性,系統(tǒng)在運行時就要為這些控件分配相應(yīng)的存儲內(nèi)存空間,造成額外的開銷。另外,控件數(shù)量太多,對界面設(shè)計處理也會造成不便。
(2)靈活程度不高;由于要模擬現(xiàn)實世界中的動態(tài)效果,在圖形處理上會有很多特殊的要求,例如圖片背景透明度的處理。由于圖片的存儲都是按照矩形的尺寸來存儲的。如果不進行透明處理,矩形控件框中圖形沒有覆蓋到的部分就會被背景色填充,那么在兩張圖片重疊時,在Z次序上面的圖片就會完全遮蓋住下面的圖片,效果就會失真。
(3)會造成屏幕閃爍;通過控件加載圖片的方式,在實現(xiàn)動畫時,其原理是將控件從當前位置擦除,然后在新的地方重新繪制。由于控件本身具有自動刷新功能,在主窗體,也就是控件所在的父窗體刷新控件時,子控件會刷新兩次,從而造成控件在畫面上移動時有閃爍。如果把主窗體的刷新頻率調(diào)慢,那么勢必會造成畫面移動時一幀一幀的跳格,給用戶很不平滑的感覺,同樣也無法和實際的設(shè)備部件運行狀態(tài)保持同步。
在上述三個弊端中,第一條,由于目前計算機硬件性能比較強,即使系統(tǒng)開銷大,也能夠滿足系統(tǒng)的運行,用戶在使用時也不會感覺有任何異常;第二條,如果用戶不是很挑剔的話,一般也能夠接受;但第三條閃爍,則會嚴重影響用戶的視覺,造成不適。
1.3 圖形編程中閃爍的原因
窗體界面外觀的改變其原理是快速的擦除原窗體,然后快速重新繪制。其底層的實現(xiàn),是調(diào)用了窗體的OnPaint方法。該方法是WM_PAINT消息的一個映射方法。此消息就是系統(tǒng)通知接收該消息的窗體要對自身進行重繪。一般情況下,父窗體及其子控件都有默認的窗體過程,都會調(diào)用缺省的OnPaint方法,而缺省的方法在內(nèi)部已經(jīng)針對閃爍進行了修復(fù)處理。但設(shè)計人員如果需要實現(xiàn)自身需要的動畫特效,就不得不在派生類中重載OnPaint方法,自行設(shè)計繪制圖形的代碼。
如果代碼中不啟用雙緩沖,其圖形是直接通過目標設(shè)備上下文對象來繪制的。在窗體刷新時,系統(tǒng)會對窗體上的所有圖元進行重繪,但是每個圖元的重繪不是同時進行,而是有順序的。換言之,圖元刷新的時間是有差異的,這是造成閃爍的最根本原因。當圖元數(shù)目不多時,窗口刷新的位置也不多,窗口閃爍效果并不嚴重;當圖元數(shù)目較多時,需要重繪的圖元數(shù)量增加,繪圖窗口每一次刷新都會導(dǎo)致較多的圖元重新繪制,窗口的較多位置都在刷新,閃爍現(xiàn)象自然就越來越嚴重。特別是圖元比較大繪制時間比較長時,閃爍問題會更加嚴重,因為時間延遲會更長。
2.1 雙緩沖的原理
雙緩沖就是有兩個緩沖區(qū),分別稱為前端緩沖區(qū)和后備緩沖區(qū)。在后備緩沖區(qū)中繪制好圖形,然后拷貝到前端緩沖區(qū)中,在屏幕上進行顯示。后備緩沖區(qū)負責實際的圖形繪制工作,前端緩沖區(qū)負責屏幕的顯示。當窗體需要重繪時,只需將后備緩沖區(qū)的內(nèi)容交換到前端緩沖區(qū)來,等待的時間只是內(nèi)存拷貝的時間,不需要等待圖形繪制的時間。因此,采用雙緩沖技術(shù),既可以解決屏幕閃爍的問題,又可以實現(xiàn)快速重繪。雙緩沖原理示意圖如圖1所示。
2.2 GDI+對雙緩沖實現(xiàn)的改進

圖1 雙緩沖原理示意
GDI是圖形設(shè)備用戶接口(Graphic Device Interface)的縮寫。主要任務(wù)是負責系統(tǒng)與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。而GDI+是GDI的升級,它屬于windows系統(tǒng)一個子系統(tǒng),是一組通過C++類實現(xiàn)的應(yīng)用程序編程接口。
GDI+對GDI的功能進行了優(yōu)化,并新增了許多新的功能,包括:漸變畫刷、基數(shù)樣條函數(shù)、持久路徑對象,變形矩陣對象等。利用GDI+組織代碼實現(xiàn)雙緩沖也比傳統(tǒng)的GDI的API方法更為方便。用傳統(tǒng)的GDI進行圖形編程,若繪制的圖元有多重層疊,那么雙緩沖也必須使用多重層疊,才能避免閃爍;但是用GDI+的話,只要構(gòu)建單層的用于雙緩沖繪圖的虛擬畫布,即使繪制的圖元有重疊,也不會引起閃爍。
2.3 圖元透明化處理
在使用傳統(tǒng)GDI編程時,用于繪制圖元的圖片一般只能接受bmp格式的文件,若要使用其他高質(zhì)量的圖片文件,例如png文件,需要設(shè)計者另外編寫很復(fù)雜的程序。在繪制圖形時有很多特殊的要求,例如圖片背景透明處理。而使用png格式的圖片,在編寫透明處理功能時會比較簡單,不需要做復(fù)雜的處理和運算。GDI+通過流加載的方式,能夠很方便地將各種格式的圖片加載到源代碼中,大大簡化了設(shè)計者使用GDI載入圖片時的工作量。
當多個圖元重疊繪制時,如果不進行背景透明化處理,那么先繪制的圖元沒有被后繪制的圖元遮擋住,理應(yīng)看得到的部分就會被后繪制圖元的背景色覆蓋,造成效果失真。如圖2所示。

圖2 未進行背景透明處理
從圖2可以看出透過圓圈未涉及到的部分應(yīng)該可以看到矩形框的底色,但是被圓圈圖片矩形框的背景色給填充了,而實際效果應(yīng)該是如圖3所示。

圖3 進行了背景透明處理
2.4 高級色彩功能的支持
圖形繪制時會涉及到很多特殊功能。例如,圖片的旋轉(zhuǎn),反轉(zhuǎn),繪制曲線、多邊形、多彩色以及漸變色的使用。如果使用傳統(tǒng)的GDI圖形庫編程,要接收帶有alpha通道的ARGB色彩的話,要進行復(fù)雜的編程,而且不支持漸變畫刷,所以對于復(fù)雜的圖形色彩編程,不是很理想。
GDI+可以很好地支持上面所描述的漸變色以及色彩透明化處理,不需要太多復(fù)雜的運算及編碼,即可完成復(fù)雜的圖形處理。如圖4,圖5所示。
漸變色在表現(xiàn)形式上更柔和,視覺效果更好。另外,GDI+對圖形繪制有很大的優(yōu)化改善,例如,消除鋸齒現(xiàn)象。如圖6所示。

圖4 使用了漸變色

圖5 未使用漸變色

圖6 圖形的鋸齒現(xiàn)象
由圖6所示,左邊的圓圈邊緣有很多“毛刺”這是因為傳統(tǒng)的GDI圖形方法,沒有對像素排列作優(yōu)化處理,導(dǎo)致有鋸齒現(xiàn)象,而右邊的圓圈是用GDI+中方法繪制的圓圈。很明顯,周邊沒有所謂的“毛刺”,而且線條的視覺感更柔和。
多靶磁控濺射系統(tǒng)中,包含有多個運動部件:載片車鏈條傳動、擋板鏈條傳動、基片架升降運動以及清洗臺的氣缸升降。其中取片放片時載片車與基片架會有運動上的交互和聯(lián)動互鎖;清洗和烘烤基片時,載片車會與清洗臺有運動上的交互和聯(lián)動互鎖。此時軟件界面上勢必會有兩者的圖元重疊。為了更好、更貼切實際地實現(xiàn)這種運動特效,必定要實現(xiàn)對圖元的背景透明處理以及使用雙緩沖消除屏幕閃爍現(xiàn)象。
3.1 實現(xiàn)過程
根據(jù)2.2小節(jié)中描述的動畫設(shè)計的流程,首先要準備好用于實現(xiàn)圖畫的靜態(tài)圖片。為了很好地實現(xiàn)背景透明化處理,圖片應(yīng)該選用對alpha通道有很好支持的png格式文件。背景透明化處理的偽代碼如下:

圖元加載并設(shè)置了透明處理后,接下來就是根據(jù)業(yè)務(wù)需求,計算出圖元應(yīng)在界面上實時出現(xiàn)的位置,然后實時刷新界面,即可實現(xiàn)動畫特效。C++窗體程序中,刷新界面實際上是向界面發(fā)送了WM_PAINT消息,即重繪當前畫面,系統(tǒng)接收到此消息后,會調(diào)用該消息的底層映射函數(shù)OnPaint,雙緩沖的實現(xiàn)即在此函數(shù)中。其偽代碼如下:

完成上述代碼,最后在定時器中每隔若干毫秒,刷新一次界面,即完成了動畫特效,刷新越頻繁,動畫效果就越平滑。
3.2 實現(xiàn)效果
設(shè)置了透明度后,當載片車運動到基片架位置,并與基片架圖元重合時,不會發(fā)生圖元覆蓋的現(xiàn)象。如圖7、圖8所示。

圖7 未做背景透明處理

圖8 做了背景透明處理
由上述圖7、圖8可以看出,載片車的圖元如果沒做透明處理,底層的基片架圖元被載片車圖元的空余部分的背景色覆蓋;而做了透明處理的載片車圖元,可以看到下層的基片架,這樣更符合實際效果。
采用漸變色和透明處理,不僅僅是改善視覺效果,更多的是在需要做標記的時候,不影響原來的顯示效果。在多靶磁控濺射系統(tǒng)中,四個靶共用一臺電源,通過開關(guān)選擇器決定電源與哪個靶位相通。當某個靶位與電壓接通時,應(yīng)在軟件界面上進行標記,以告知用戶其狀況。如圖9所示。

圖9 使用了透明化和漸變色處理
如果不是用漸變色和透明化處理,則會如圖10所示。

圖10 未使用透明化和漸變色處理
雖然哪個靶位與電源相通是標記出來了,但原先的靶位圖元以及該靶位所裝載的材料信息都被紅色覆蓋掉了,用戶則無法得知其靶位材料信息。
本文闡述了雙緩沖的原理、GDI+相對傳統(tǒng)GDI所具有的優(yōu)勢及其部分更高級繪圖功能。然后,利用偽代碼的方式對雙緩沖的實現(xiàn)算法做了詳細的描述。雙緩沖將繪圖流程進行了兩步分工,即將圖形繪制功能交給與一塊指定大小的內(nèi)存區(qū)域綁定了的后臺繪圖設(shè)備對象;圖形顯示交給與實際目標設(shè)備對象進行輸出。這種分工協(xié)作的方式雖然犧牲了一定的存儲空間,但解決了由同一設(shè)備對象繪制圖形而引起的刷新延時,很好地解決了制作動畫特效時的閃爍問題。結(jié)合GDI+的高級圖形處理功能,能繪制出更豐富更有特色的圖形效果。
[1] 楊昌建.GDI+高級編程[M].北京:清華大學(xué)出版社,2010.
[2] 何建新.基于VC++的圖形編程實現(xiàn)方法[J].計算機與現(xiàn)代化,2007,45(20):31-34.
[3] 秦練,趙秀蘋,楊文杰.計算機圖形學(xué)編程實踐研究[J].北京印刷學(xué)院學(xué)報,2014,28(10):25-34.
[4] 胡春安,歐陽城添加.Windows編程中的圖形輸出[J].浙江工業(yè)大學(xué)學(xué)報,2006,44(36):146-147.
[5] 江建國,溫少營,張瑞楠.基于雙緩沖技術(shù)的GDI+無閃爍繪圖[J].計算機應(yīng)用,2012,32(s2):136-139.
[6] 李春雨.計算機圖形學(xué)及實用編程技術(shù)[M].北京航空航天大學(xué)出版社,2013,31(2):54-63.
The Application of Graphic Double Buffer And GDI+in Multiple Target Magnet Sputtering System
Chen Li-ning,Luo Chao,Lin Bo-qi,Peng Dong
(The 48thResearch Institute of CETC,Changsha,410111)
It describes how to use the senior functions in GDI plus and animate the magnet sputtering process on UI in this dissertation.The application of double buffer in the system makes users have a real time view about the magnet sputtering process on top of the software UI without taking a bad look at the inside by a small window.
Double buffer;Flashing;GDI+(Graphic Device Interface)
TN305.92
A
1004-4507(2017)04-0050-06
陳立寧(1984-),男,碩士,主要研究方向為數(shù)據(jù)庫技術(shù)、數(shù)據(jù)挖掘。
2017-04-06