资源描述
航空数字化仪表中动画显示技术应用
于化龙, 马齐爽
(北京航空航天大学自动化科学与电气工程学院, 北京, 100083)
摘要: 针对实际航空数字化仪表, 给出了SVGA显示模式下动画显示实现过程, 其中包含了直接写屏技术、 双缓冲技术等, 并提出了一个利用显存本身实现双缓冲动画显示新方法。
关键词: 数字化仪表; SVGA; 动画; 双缓冲
The Application of Technology of Mobile Picture Displaying
in Aeronautic Digital Meter
YU Hua-long, MA Qi-shuang
(School of Automation Science 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 by using video buffer.
Keywords: digital meter; SVGA; mobile picture; double-buffer
一、 引言
现在飞机座舱显示系统中使用电子显示仪表,基础上沿用传统指针显示形式。而计算机成像彩色动画显示格式,则突破了传统显示形式,使飞行员能快速掌握瞬息改变动态信息,做到一目了然,直接提升飞行员作战能力。在座舱显示系统中最常见显示方法就是指针指示。这就包含到指针动态显示原理, 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存放段。
分辩率模式表
中止号
分辩率
色彩数
首地址
备注
0x101
640*480
256
0xa0000000
本系统所采取模式
0x103
800*600
256
0xa0000000
和上一个一样, 只是图形素多了部分而已
0x105
1024*768
256
0xa0000000
也只是多了部分像素点
0x110
640*480
65536
0xa0000000
一个高彩分辨模式
0x113
800*600
65536
0xa0000000
和上一个一样, 只是像素点更多了。
表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 动画显示步骤图
六、 结论
本人所开发某机载显示系统中, 采取上述动画显示方法, 很好处理了仪表中指针闪烁问题, 大大提升了效率, 而且在实际系统中对指针进行了消抖与平滑处理, 使仪表显示效果得到很大改善。
参考文件
浦滨著, C游戏编程从入门到精通, 北京期望电子出版社, 5月
作者介绍
于化龙: 男, 北京航空航天大学自动化科学与电气工程学院, 硕士硕士, 研究方向为测试计量技术及仪器。
马齐爽: 男, 北京航空航天大学自动化科学与电气工程学院, 教授, 博士生导师, 关键从事测试计量技术及仪器研究。
展开阅读全文