《直接写屏技术的实现》由会员分享,可在线阅读,更多相关《直接写屏技术的实现(5页珍藏版)》请在金锄头文库上搜索。
1、航空数字化仪表中动画显示技术的应用于化龙,马齐爽(北京航空航天大学自动化科学与电气工程学院,北京, 100083)摘要:针对实际的航空数字化仪表,给出了 SVGA 显示模式下动画显示的实现过程,其中包括了直接写屏技术、双缓冲技术等,并提出了一种利用显存自身实现双缓冲动画显示的新方法。关键词:数字化仪表;SVGA;动画;双缓冲The Application of Technology of Mobile Picture Displaying in Aeronautic Digital MeterYU Hua-long,MA Qi-shuang(School of Automation Scien
2、ce And Electrical Engineering, Beihang University, Beijing,100083)Abstract: This paper presents the operating process of mobile picture displaying in SVGA mode, which includes the technology of directly writing screen and that of double-buffer, and presents a new method of mobile picture displaying
3、by using video buffer. Keywords: digital meter; SVGA; mobile picture; double-buffer一、引言目前飞机座舱显示系统中使用的电子显示仪表,基本上沿用传统的指针显示形式。而计算机成像的彩色动画显示格式,则突破了传统的显示形式,使飞行员能迅速掌握瞬息变化的动态信息,做到一目了然,直接提高飞行员的作战能力。在座舱显示系统中最常见的显示方式就是指针指示。这就涉及到指针的动态显示原理, C 语言标准图形函数通常强调更高的通用性,于是必然付出函数效率很低的代价,另外也不支持 256 色的显示模式,不能满足座舱显示系统的要求,所以
4、本人开发了一套 SVGA256 色显示模式下的图形函数库,从显示模式设置的的底层开始,到运用显存自身实现双缓冲显示技术,大大提高了效率与显示质量。二、常用动画显示技术介绍图形动画技术有很多种,对 C 语言编程比较适合的主要包括:1) 重画技术:画了擦,擦了再画,或者一张一张贴(覆盖)上去。这是最常用的一种技术,操作比较简单,又分为全屏重画和局部重画两种,但动画效果较差,存在闪烁现象。2) 异或技术:通过对写入点和屏幕颜色进行逻辑异或运算,来实现擦除和重画运动部分的动画。具体的说就是如果在同一个位置用异或的方法画两个颜色相同的点,点会消失;而用不同颜色画点,点会变成第三种颜色。这种方法由于也存在
5、二次擦除的过程,所以也会有闪烁现象。3) 调色板技术:利用预先设置的动作图片和显示适配中彩色表(调色板寄存器)通过屏幕的颜色变化来实现动画的技术。在 SVGA 显示模式下,256 种颜色分别对应 256 个调色板寄存器,而每种颜色又是由 R、 G、B(范围都是 0-255)三原色的值配出来的,每一个寄存器中的值可由程序进行设置,即可以通过程序改变这 256 个索引颜色的实际颜色。于是可以先将几个索引颜色设置为黑色,然后使用这几个索引颜色依次绘制出动画元素每个动画动作,这样每次将当前位置动作所用的索引颜色值设为当前颜色,其它动作的索引颜色设为黑色,就可以实现动画显示。这种动画方法由于不对屏幕进行
6、操作,所以画面及其稳定、流畅,无闪烁现象。但由于动画的所有动作都必须在动画之前完成,而且要用不同的索引颜色,所以这种方法无法处理复杂的动画元素。对于机载显示系统来说,指针的实际位置很多,而且要根据实际情况而定,所以无法采用调色板技术实现指针的动画显示。本人所开发的某机载显示系统中,需要 256 色支持,所以采用了 SVGA 显示模式,运用重画技术与双缓冲技术相结合来实现仪表中指针及其它图像的动态显示。重画技术是编程人员最容易想到的一种动画方法,它来自于人们对动画显示最基本的理解将前一次显示的图形擦去再在当前位置画上要显示的图形。但这种方法存在着一个致命的缺点,那就是图形闪烁问题。闪烁现象主要是
7、由于将擦写的操作过程放在观众面前造成的,于是我们可以考虑将操作放到幕后,待操作完成后再将它快速映射到屏幕上去。事实上这将大大提高动画显示的速度和稳定性。在 C 语言标准图形函数中也提供了 setvisualpage()和 setactivepage()两个函数来实现这一思想,但这两个函数的操作是对整个屏幕进行映射,效率较低,而且在 SVGA 显示模式下无法应用,所以必须从 SVGA 模式的设置、显示原理的底层出发来实现最终的动画显示。 三、SVGA 显示模式设置SVGA 显示模式建立在 VESA 标准之上,可以提供多种高分辨率的 256 色图形模式(表 1) 。VESA-BIOS 功能也是通过
8、中断 10h 来实现的,所有功能的调用格式为:AH4Fh,ALVESA 功能代码,功能代码为 00h,返回 VESA 基本信息;功能代码为 01h,返回 VESA 特定模式信息;功能代码为 02h,设置显示;功能代码为 03h,返回当前显示模式;功能代码为 05h,控制 VRAM 存储段。表 1 SVGA 模式下分辨率表下面给出 SVGA 设置的基本操作函数:1) 设置显示模式void InitMode(int mode) /mode 为显示方式号(表 1 中的中断号)if(mode = 0x100)分辩率模式表中断号 分辩率 色彩数 首地址 备注0x101 640*480 256 0xa00
9、00000 本系统所采用的模式0x103 800*600 256 0xa0000000 和上一种一样,只是图形素多了一些而 已0x105 1024*768 256 0xa0000000 也只是多了一些像素点0x110 640*480 65536 0xa0000000 一种高彩分辨模式0x113 800*600 65536 0xa0000000 和上一种一样,只是像素点更多了。asm mov ax, 4f02h /设置显示方式功能号 AL=02hasm mov bx, mode /bx=显示方式号asm int 10helseasm mov ah,0;asm mov al,mode;asm in
10、t 10h;2) 设置 VRAM 段void SelectPage(int page)/page 为 VRAM 存储段号asm pushaasm mov ax, 4f05h /VRAM 存储段控制功能号 AL=05hasm mov bx, 0 /bx=0000h 为设置 VRAM 段号,bx=0100h 为检测 VRAM 段号asm mov dx, page /dx=要设置的 VRAM 存储段段号(015)asm int 10hasm popa四、直接写屏技术的实现直接写屏技术就是计算出屏幕上的点所对应的显示内存位置,然后根据常规的坐标计算将图形通过点的形式保存到对应位置的显示内存中去。用直接
11、写屏技术,画一满屏的点,只要用 0.05 秒左右,这就是说,直接写屏比用 C 语言的函数写屏,起码快出了二十左右。本系统选择的 SVGA 模式显示分辨率为 640480,256 色,屏幕上的一个象素点在显存中占用一个字节。该模式采用了内存分段处理技术,即将整个显存划分为若干个段,使每段大小为 64K,起始地址为 A000:0000H,可以通过对段进行读写操作来实现对整个显存的访问。如果用(x,y)表示屏幕上的一个象素点,那么该象素点在显存中的地址计算公式为:VRAM 段号( y640x)/65536(/为整除) ;段内偏移地址(y640x)%65536 (% 为取余)下面给出向显存写点的具体实
12、现函数:void PutPixel(int x, int y, unsigned char color)long Location;int Page = 0, off = 0;Location = (long)y 16; /Page=Location/65536off = Location /off=Location%65536SelectPage(Page); /选择 VRAM 段*(video_buffer + off) = color; / video_buffer 为显存首地址五、利用显存自身实现双缓冲动画显示通常缓冲技术的具体过程可以理解为:有两个屏幕,一个是当前屏幕,一个是绘制屏幕
13、。当前屏幕实际上就是我们可以直接看到的屏幕(显存) ,而绘制屏幕就是我们开设的与显存大小相同的内存区域。我们将一张画面绘制到绘制屏幕(申请的内存)中去,等当前屏幕显示了足够的时间后再将其替换上去。所以,当前屏幕上从未进行过任何绘制操作,所有操作都在绘制屏幕上完成。这样在当前屏幕上就只看到了完工的画面,可以很好的消除由擦写带来的闪烁现象。在系统的开发过程中,我们发现很难申请到与屏幕大小相同的内存空间,根据系统自身的特点,利用显存自身来实现上述的双缓冲思想。本机载显示系统采用的显示器尺寸为 320240,而选用的 SVGA 模式分辨率为640480,实际在该系统显示屏幕上只显示出了实际尺寸左上部
14、320240 的区域,而其它的区域是显示不出来的。这样就给我们提供了一个现有的空间作为擦写专用的绘制屏幕,而不必去另外申请内间。实际,采用右上部分 320240 的区域作为绘制屏幕(观众是看不到的) ,在直接写屏时只需将横坐标增加 320 个象素单位,就可以将图形绘制在幕后,待完成了擦除、重画的操作后再将绘制屏幕上的图像平移到显示屏幕上,这样就利用现有的显存实现了双缓冲的动画显示。图 1 利用显存自身实现双缓冲动画显示示意图在将绘制屏幕的图像 copy 到当前屏幕时,应十分注意同一行存在两个段值时的移动方法。0-101 行都在 0 号段内, 103-203 行都在 1 号段内,205-239
15、行都在 2 号段内,这些行都可以直接调用汇编函数实现段内转移。102、204 两行内都存在两个段号,需借助临时缓存实现平移。下面给出字传送的实际函数:void MoveWord(unsigned char far * dest, unsigned char far * sour, unsigned int size)asm push dsasm mov cx,sizeasm les di,destasm lds si,sourasm cldasm rep movsw /传送字asm pop ds综上,可以得到该显示系统动画显示的流程图如下:图 2 动画显示流程图六、结论本人所开发的某机载显示系统中,采用上述动画显示方法,很好的解决了仪表中指针闪烁的问题,大大提高了效率,并且在实际系统中对指针进行了消抖与平滑的处理,使仪表的显示效果得到很大的改善。参考文献浦滨著,C 游戏编程从入门到精通,北京希望电子出版社,2002 年 5 月作者简介于化龙:男,北京航空航天大学自动化科学与电气工程学院,硕士研究生,研究方向为测试计量技术及仪器。马齐爽:男,北京航空航天大学自动化科学与电气工程学院,教授,博士生导师,主要从事测试计量技术及仪器的研究。