亚洲av永久无码精品一百度,日韩精品无码一区二区视频,无码中文AV波多野吉衣,欧美V成 人在线观看

航空數(shù)字化儀表中動畫顯示技術的應用

分享到:
點擊量: 261234


摘  要:針對實際的航空數(shù)字化儀表,給出了SVGA顯示模式下動畫顯示的實現(xiàn)過程,其中包括了直接寫屏技術、雙緩沖技術等,并提出了一種利用顯存自身實現(xiàn)雙緩沖動畫顯示的新方法。

關鍵詞:數(shù)字化儀表;SVGA;動畫;雙緩沖

一、 引言

  目前飛機座艙顯示系統(tǒng)中使用的電子顯示儀表,基本上沿用傳統(tǒng)的指針顯示形式。而計算機成像的彩色動畫顯示格式,則突破了傳統(tǒng)的顯示形式,使飛行員能迅速掌握瞬息變化的動態(tài)信息,做到一目了然,直接提高飛行員的作戰(zhàn)能力。在座艙顯示系統(tǒng)中*常見的顯示方式就是指針指示。這就涉及到指針的動態(tài)顯示原理, C語言標準圖形函數(shù)通常強調(diào)更高的通用性,于是必然付出函數(shù)效率很低的代價,另外也不支持256色的顯示模式,不能滿足座艙顯示系統(tǒng)的要求,所以本人開發(fā)了一套SVGA256色顯示模式下的圖形函數(shù)庫,從顯示模式設置的的底層開始,到運用顯存自身實現(xiàn)雙緩沖顯示技術,大大提高了效率與顯示質(zhì)量。

二、 常用動畫顯示技術介紹

  圖形動畫技術有很多種,對C語言編程比較適合的主要包括:

  1) 重畫技術:

  畫了擦,擦了再畫,或者一張一張貼(覆蓋)上去。這是*常用的一種技術,操作比較簡單,又分為全屏重畫和局部重畫兩種,但動畫效果較差,存在閃爍現(xiàn)象。

  2) 異或技術:

  通過對寫入點和屏幕顏色進行邏輯異或運算,來實現(xiàn)擦除和重畫運動部分的動畫。具體的說就是如果在同一個位置用異或的方法畫兩個顏色相同的點,點會消失;而用不同顏色畫點,點會變成第三種顏色。這種方法由于也存在二次擦除的過程,所以也會有閃爍現(xiàn)象。

  3) 調(diào)色板技術:

  利用預先設置的動作圖片和顯示適配中彩色表(調(diào)色板寄存器)通過屏幕的顏色變化來實現(xiàn)動畫的技術。在SVGA顯示模式下,256種顏色分別對應256個調(diào)色板寄存器,而每種顏色又是由R、G、B(范圍都是0-255)三原色的值配出來的,每一個寄存器中的值可由程序進行設置,即可以通過程序改變這256個索引顏色的實際顏色。于是可以先將幾個索引顏色設置為黑色,然后使用這幾個索引顏色依次繪制出動畫元素每個動畫動作,這樣每次將當前位置動作所用的索引顏色值設為當前顏色,其它動作的索引顏色設為黑色,就可以實現(xiàn)動畫顯示。

  這種動畫方法由于不對屏幕進行操作,所以畫面及其穩(wěn)定、流暢,無閃爍現(xiàn)象。但由于動畫的所有動作都必須在動畫之前完成,而且要用不同的索引顏色,所以這種方法無法處理復雜的動畫元素。對于機載顯示系統(tǒng)來說,指針的實際位置很多,而且要根據(jù)實際情況而定,所以無法采用調(diào)色板技術實現(xiàn)指針的動畫顯示。

  本人所開發(fā)的某機載顯示系統(tǒng)中,需要256色支持,所以采用了SVGA顯示模式,運用重畫技術與雙緩沖技術相結合來實現(xiàn)儀表中指針及其它圖像的動態(tài)顯示。重畫技術是編程人員*容易想到的一種動畫方法,它來自于人們對動畫顯示*基本的理解——將前一次顯示的圖形擦去再在當前位置畫上要顯示的圖形。但這種方法存在著一個致命的缺點,那就是圖形閃爍問題。閃爍現(xiàn)象主要是由于將擦寫的操作過程放在觀眾面前造成的,于是我們可以考慮將操作放到幕后,待操作完成后再將它快速映射到屏幕上去。事實上這將大大提高動畫顯示的速度和穩(wěn)定性。在C語言標準圖形函數(shù)中也提供了setvisualpage()和 setactivepage()兩個函數(shù)來實現(xiàn)這一思想,但這兩個函數(shù)的操作是對整個屏幕進行映射,效率較低,而且在SVGA顯示模式下無法應用,所以必須從SVGA模式的設置、顯示原理的底層出發(fā)來實現(xiàn)*終的動畫顯示。

三、 SVGA顯示模式設置

  SVGA顯示模式建立在VESA標準之上,可以提供多種高分辨率的256**形模式(表1)。VESA-BIOS功能也是通過中斷10h來實現(xiàn)的,所有功能的調(diào)用格式為:AH=4Fh,AL=VESA功能代碼,功能代碼為00h,返回VESA基本信息;功能代碼為01h,返回VESA特定模式信息;功能代碼為02h,設置顯示;功能代碼為03h,返回當前顯示模式;功能代碼為05h,控制VRAM存儲段。

  表1 SVGA模式下分辨率表

 


  下面給出SVGA設置的基本操作函數(shù):

  1) 設置顯示模式

  void InitMode(int mode) //mode為顯示方式號(表1中的中斷號)

 ?。?/p>

  if(mode >= 0x100)

 ?。?/p>

  asm mov ax, 4f02h //設置顯示方式功能號AL=02h

  asm mov bx, mode //bx=顯示方式號

  asm int 10h

 ?。?/p>

  else

  {

  asm mov ah,0;

  asm mov al,mode;

  asm int 10h;

 ?。?/p>

 ?。?/p>

  2) 設置VRAM段

  void SelectPage(int page)//page為VRAM存儲段號

 ?。?/p>

  asm pusha

  asm mov ax, 4f05h //VRAM存儲段控制功能號AL=05h

  asm mov bx, 0 //bx=0000h為設置VRAM段號,bx=0100h為檢測VRAM段號

  asm mov dx, page //dx=要設置的VRAM存儲段段號(0~15)

  asm int 10h

  asm popa

 ?。?/p>

四、 直接寫屏技術的實現(xiàn)

  直接寫屏技術就是計算出屏幕上的點所對應的顯示內(nèi)存位置,然后根據(jù)常規(guī)的坐標計算將圖形通過點的形式保存到對應位置的顯示內(nèi)存中去。用直接寫屏技術,畫一滿屏的點,只要用0.05秒左右,這就是說,直接寫屏比用C語言的函數(shù)寫屏,起碼快出了二十左右。

  本系統(tǒng)選擇的SVGA模式顯示分辨率為640×480,256色,屏幕上的一個象素點在顯存中占用一個字節(jié)。該模式采用了內(nèi)存分段處理技術,即將整個顯存劃分為若干個段,使每段大小為64K,起始地址為A000:0000H,可以通過對段進行讀寫操作來實現(xiàn)對整個顯存的訪問。如果用(x,y)表示屏幕上的一個象素點,那么該象素點在顯存中的地址計算公式為:

  VRAM段號=(y×640+x)/65536(/為整除);

  段內(nèi)偏移地址=(y×640+x)%65536(%為取余)

  下面給出向顯存寫點的具體實現(xiàn)函數(shù):

  void PutPixel(int x, int y, unsigned char color)

 ?。?/p>

  long Location;

  int Page = 0, off = 0;

  Location = ((long)y<<9) + ((long)y<<7) + x; //Location=y*640+x

  Page = Location >> 16; //Page=Location/65536

  off = Location & 0xffff; //off=Location%65536

  SelectPage(Page); //選擇VRAM段

 ?。╲ideo_buffer + off) = color; // video_buffer為顯存首地址

 ?。?/p>

五、 利用顯存自身實現(xiàn)雙緩沖動畫顯示

  通常緩沖技術的具體過程可以理解為:有兩個屏幕,一個是當前屏幕,一個是繪制屏幕。當前屏幕實際上就是我們可以直接看到的屏幕(顯存),而繪制屏幕就是我們開設的與顯存大小相同的內(nèi)存區(qū)域。我們將一張畫面繪制到繪制屏幕(申請的內(nèi)存)中去,等當前屏幕顯示了足夠的時間后再將其替換上去。所以,當前屏幕上從未進行過任何繪制操作,所有操作都在繪制屏幕上完成。這樣在當前屏幕上就只看到了完工的畫面,可以很好的消除由擦寫帶來的閃爍現(xiàn)象。

  在系統(tǒng)的開發(fā)過程中,我們發(fā)現(xiàn)很難申請到與屏幕大小相同的內(nèi)存空間,根據(jù)系統(tǒng)自身的特點,利用顯存自身來實現(xiàn)上述的雙緩沖思想。

  本機載顯示系統(tǒng)采用的顯示器尺寸為320×240,而選用的SVGA模式分辨率為640×480,實際在該系統(tǒng)顯示屏幕上只顯示出了實際尺寸左上部320×240的區(qū)域,而其它的區(qū)域是顯示不出來的。這樣就給我們提供了一個現(xiàn)有的空間作為擦寫專用的繪制屏幕,而不必去另外申請內(nèi)間。實際,采用右上部分320×240的區(qū)域作為繪制屏幕(觀眾是看不到的),在直接寫屏時只需將橫坐標增加320個象素單位,就可以將圖形繪制在幕后,待完成了擦除、重畫的操作后再將繪制屏幕上的圖像平移到顯示屏幕上,這樣就利用現(xiàn)有的顯存實現(xiàn)了雙緩沖的動畫顯示。

 

圖1 利用顯存自身實現(xiàn)雙緩沖動畫顯示示意圖

  在將繪制屏幕的圖像copy到當前屏幕時,應十分注意同一行存在兩個段值時的移動方法。0-101行都在0號段內(nèi),103-203行都在1號段內(nèi),205-239行都在2號段內(nèi),這些行都可以直接調(diào)用匯編函數(shù)實現(xiàn)段內(nèi)轉移。102、204兩行內(nèi)都存在兩個段號,需借助臨時緩存實現(xiàn)平移。下面給出字傳送的實際函數(shù):

  void MoveWord(unsigned char far * dest, unsigned char far * sour, unsigned int size)

  {

  asm push ds

  asm mov cx,size

  asm les di,dest

  asm lds si,sour

  asm cld

  asm rep movsw //傳送字

  asm pop ds

  }

  綜上,可以得到該顯示系統(tǒng)動畫顯示的流程圖如下:

 

圖2 動畫顯示流程圖

六、 結論

  本人所開發(fā)的某機載顯示系統(tǒng)中,采用上述動畫顯示方法,很好的解決了儀表中指針閃爍的問題,大大提高了效率,并且在實際系統(tǒng)中對指針進行了消抖與平滑的處理,使儀表的顯示效果得到很大的改善。