技術頻道

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

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

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

      一、 引言

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

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

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

        1) 重畫技術:

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

        2) 異或技術:

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

        3) 調色板技術:

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

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

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

      三、 SVGA顯示模式設置

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

        表1 SVGA模式下分辨率表

        下面給出SVGA設置的基本操作函數:

        1) 設置顯示模式

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

        {

        if(mode >= 0x100)

        {

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

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

        asm int 10h

        }

        else

        {

        asm mov ah,0;

        asm mov al,mode;

        asm int 10h;

        }

        }

        2) 設置VRAM段

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

        {

        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

        }

      四、 直接寫屏技術的實現

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

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

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

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

        下面給出向顯存寫點的具體實現函數:

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

        {

        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段

        *(video_buffer + off) = color; // video_buffer為顯存首地址

        }

      五、 利用顯存自身實現雙緩沖動畫顯示

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

        在系統的開發過程中,我們發現很難申請到與屏幕大小相同的內存空間,根據系統自身的特點,利用顯存自身來實現上述的雙緩沖思想。

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


      圖1 利用顯存自身實現雙緩沖動畫顯示示意圖

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

        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

        }

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


      圖2 動畫顯示流程圖

      六、 結論

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

      文章版權歸西部工控xbgk所有,未經許可不得轉載。

      主站蜘蛛池模板: 国产综合视频在线观看一区 | 国产91久久精品一区二区 | 成人午夜视频精品一区| 成人精品一区二区电影| 国产午夜精品一区二区三区极品| 亚洲国产AV一区二区三区四区| 日韩毛片基地一区二区三区| 中文字幕AV一区二区三区人妻少妇| 国产91大片精品一区在线观看| 一区二区三区在线观看| 亚洲国产AV无码一区二区三区| 日本v片免费一区二区三区| 国产一区二区在线观看视频| 色多多免费视频观看区一区| 日韩精品一区二区三区不卡 | 一区国产传媒国产精品| 亚洲熟女乱色一区二区三区| 无码一区二区三区中文字幕| 国产在线一区二区杨幂| av无码精品一区二区三区四区| 久久无码人妻精品一区二区三区| 最美女人体内射精一区二区| 无码人妻精品一区二区三区66 | 视频在线一区二区| 久久久99精品一区二区| 国产在线精品一区二区在线观看| 99久久综合狠狠综合久久一区| 久久毛片一区二区| 精品一区二区三区电影| 成人免费一区二区三区| 日韩一区二区在线观看视频| 亚洲AV无码一区二区三区电影 | 91精品一区二区综合在线| 精品人妻无码一区二区三区蜜桃一| 后入内射国产一区二区| 一本AV高清一区二区三区| 影音先锋中文无码一区| 国产成人综合精品一区| 久久久久人妻一区精品性色av| 午夜视频一区二区| 91福利国产在线观看一区二区|