2024年3月15日发(作者:)
维普资讯
●
●
文章编号:1671—7104(2007)04-0267-04
一
种基于DirectX的WindowsXP环境下
波形全屏快速滚动显示技术
【作 者】 邹人俊。.邹人钢
1江西省轻工业设计院(江西.南昌 330002)
2南昌市青山湖区农业局
【摘 要】
利用微软的DirectX技术.在PC机上WindowsXP环境下实现了波形的高分辨率全屏快速滚动显示.在分辨率为
1280 X 1024时速度最快可达1米,秒.波形滚动流畅不抖动。
【关键词】
DiretX WindowsXP 波形 滚动
【中图分类号】
TP31
【文献标识码】
A
A Full Screen Waveform Fast Scrolling Method Based on Direct X
Technology under WindowsXP
【Writers】
ZOU Ren-jun。,ZOU Ren-gang
1 Jiangxi Provincial Light Industry Design Institute,nanchang,Jiangxi Pravince,330002
2 Qingshanhu District Agriculture Bureau,Nanchang,Jiangxi Province
The microsoft DirectX technique is utilized to achieve the display of fast moving waveforn1s with high resolution and full
screen in the environment of WindowsXP.The waveforms can move fluently under the resolution of 1 280 X 1 024 with
the fastest speed of 1 m/s without any dither.
[Key words]
DirectX.WindowsXP,waveform,scrol l
在生物医学仪器中,很多都要求将所采集到的波
内存的线性访问,给系统的数据存贮和后期信号处理
形在屏幕上快速显示出来,方式有滚屏和刷屏两种。 工作带来困难。
滚屏是指波形在屏幕上连续地朝一个方向滚动,刷屏
随着Windows的发展和普及,以其独特的设备无
则是指屏幕上波形以一定的时间间隔一帧一帧地自左
关性,友好的用户界面,完善的内存管理机制,取代了
至右逐步刷新。两者相比较,滚屏方式显示更自然,能
DOS而成为微机操作系统的主流。但正是由于设备无
够让医生一目了然连续地观察到各种生理信号的变化, 关性,Windows不允许程序员直接访问某一具体的硬
不会遗漏信息而得到用户的青睐;而刷屏方式则不够
件设备,必须通过它提供的统一的接口。对显示卡的
直观,容易遗漏信息而逐渐被仪器制造商所放弃。但
访问是通过调用Windows提供的GDI函数来完成的。
滚屏显示对显示卡和显示程序的运行速度提出了很高
这种间接的访问方式使得绘图速度变慢,波形滚动速
要求。为了让波形滚动快速流畅不抖动不闪烁,要求
度加快时会出现严重的闪烁和抖动。这一难题一直困
图形显示具有60帧/秒以上的绘制速度。这就要求编 扰着设计人员,因此快速滚屏在Windows环境下是件
程者具有丰富的技巧和经验。在DOS操作系统下,
困难的事。
DOS程序员只能是根据某一特定显示卡的具体结构,
表1三种类型的显示程序的特点比较
Tab.1.A comparison among 3 types ofdisplay programs
采用汇编语言通过直接操作显示卡的寄存器和显存,才
能达到所需的速度,实现波形的全屏滚动显示。这样
鬃 骠劈 甩 lj徊 毒 0硬件妻斌 晦鬣寻址方式 。 软件蒙褰牲
做的缺陷是:软件缺乏通用性,只能在某一种显示卡
D0s
鬈窘船
≈强谚 可I好 誊懿访问 | l苓 以上糍线性寻内存址 _ 针衔发封某—, 特宠用显
上使用,因为计算机硬件的更新淘汰迅速,常给仪器的
葶簿Wia ̄m,s | 通过GDI接口 可线幢 争址IM 最 西
维修带来困难;由于DOS本身的局限,程序界面难以
\ 显 醛 自 鞭彘酶 ‘以 赶内存
做到友好,医生感到使用不够方便,无法实现大容量
。
| 嘲 示
謦窟序
轳 毫蕊液 i| 萄线拣寻址l
以上犬内存
^董 茸脬
维普资讯
●
●
我们经过研究和实践,提出了一种基于DirectX的
Windows环境下的快速滚屏技术,在Pentium III 800
以上的PC机中实现了波形在1280×1024分辨率下的
快速流畅滚动,毫无闪烁和抖动感,图形绘制速度达到
了83帧/秒,可以实现最快1米/秒的波形滚动速度。
DirectX是Microsoft推出的一种Windows环境下的多
媒体开发工具,它包含了编制下一代计算机游戏和多
媒体应用程序的最新技术和工具,为广大的程序员提
供了一整套的应用程序接口API,使程序设计人员能
够设计高性能实时的应用程序。利用DirectX,软件开
发人员就可以获得设备无关性的优点,同时又可以直
接访问硬件,并且使硬件能充分利用。利用DirectX提
供的接口,只要显示卡支持DirectX规范,都可以用此
技术编制的程序而不用作任何改变。目前生产的显示
卡大部分都支持DirectX规范,这种良好的通用性为系
统的升级和维护带来方便。
微软公司出的DirectX规范包括DirectDraw、
DirectSound、DirectPlay、Direct3D、Directlnput、
DirectSetup和AutoPlay七个部分,本显示系统主要利
用了其中的DirectDraw和Directlnput两部分。
因为c++语言更能对计算机硬件作直接的访问,
所以DirectX采用了c++语言作为开发的主语言。而
DirectX又是专门为Visual c++设计的,虽然用Borland
c++也可以开发DirectX程序,市场上也有许多第三方
图1程序流程图
公司针对DirectX而开发的运行在不同编程环境中的
F|g.1.The program lfowchart
控件,但是考虑到程序运行的速度、效率和兼容性问
1.1创建一个Windows窗体
题,我们决定采用Visual C++6.0作为开发工具。
创建Windows窗体的方法有多种,为了使显示程
本显示系统的构架是利用DirectDraw来实现绘制
序尽量小巧简单,便于其他软件调用,我们采用
滚动波形的任务,而利用Directlnput来处理用户键盘
Windows API的方法实现。在本程序中,由于我们使
输入,实现人机交互工作。本方法的基本思想是:充分
用了全屏独占方式的DirectDraw对象,所以该窗口并
利用DirectDraw的快速位图复制和主辅缓存翻转技
不会被显示出来。
术,先在主缓存中画出一帧波形,然后将其移位复制到
1.2创建DirectDraw对象
辅缓存;再在辅缓存的边缘空白处画上新的波形,再
每个DirectDraw程序都必须创建一个DirectDraw
进行翻转操作,让所画波形显示出来,再将主缓存的内
对象,可以把它看作是计算机上的显示卡。我们用函
容移位复制到辅缓存,如此反复,实现波形的连续滚动。
数SetCooperativeLevelO设置DirectDraw对象的风格。
在开发DirectX程序之前,首先要对VC的编译环
DirectDraw程序可以有窗口方式和全屏方式两种。窗
境进行设置,需要打开一个新的project workspace,插
口方式的外观与普通Windows程序相同,而全屏方式
入适当的文件,设置环境变量使编译器能够找到需要
则没有边框和最大最小化按钮。由于只有全屏独占方
的链接库和包含文件。
式才能使用页面翻转功能和充分利用DirectDraw的全
下面通过对我们为多导生理记录仪所编的显示程序
部硬件加速,我们使用了全屏独占方式,然后利用
的分析,来说明波形滚动的实现步骤。
SetDisplayMode0函数来设置屏幕的分辨率和色彩位
维普资讯
●
●
数。这里设置成为1280×1024分辨率和8位彩色。需
SetBkColor0和SetTextColor0设置背景颜色和字体颜
要注意的是显示卡至少应有2M以上的显存,否则无法
色,用TextOut0输出要画的字体。画完图后,要用
在这么高的分辨率下工作。而现在的PC机,即使是
lpDDSPrimary一>ReleaseDc(hdc)语句将主缓存释放,
集成的显卡也能满足此要求。 否则会死机。GDI函数有简单方便的优点,但是每次
1.3创建DirectDraw表面 加解锁时间开销太大。如果用它来画动态波形,不可
DirectDraw表面实质上对应于显示卡中的一块显 避免会出现闪烁和抖动。因此,本程序的对辅缓存右
存。我们创建了带有一个主缓存和一个辅缓存的表 侧空白区域的填充部分,采用了直接显存操作法。
面。在程序中,通过CreateSurface0函数创建了一个
1.5.2直接显存操作法
主表面(DDSCAPS_PR1MARYSURFACE)、一个翻转
直接显存操作法就是直接对显存中的每一位进行
表面(DDSCAPS—FLIP)以及一个后台的缓冲区
设置,具有很高的速度和效率。它是实现波形平滑滚动
(DDSCAPS_BACKSURFACE)。至此,拥有一个主缓
的关键。由于直接写显存法只能画点,没有画直线的
存lpDDSPrimary和一个辅缓存lpDDSBack的 函数,因而首先定义了一个内联函数point(),用于在x
DirectDraw表面创建完毕,可以在其上面进行绘图和翻 轴方向上相邻两点间画直线。接下来定义了函数
转操作。
drawplaybackpointsleftO,用来完成在辅缓存右边填充
1.4位块移位复制
波形的工作。
本方法的一个重要步骤是将主缓存上的图形移位
在该函数中设置参数pointcyclenub代表在辅缓存
复制到辅缓存中去。首先定义一个矩形rcRect,它的作
右边要填充的波形点数.cp是一个64×100000的两维
用是确定想要复制的画面大小和位置。因为要将主缓
短整型数组, 存有要显示的6 4路波形数据。
存上的图形移位复制,故定义一个位移量scrollspeed。
waveamplitude、selectchannel、wave x compressrate均
它是一个全局变量,其值大小代表波形滚动速度的快 为全局变量,waveamplitude用来设置波形的幅度,
慢。这里将矩形的左上角定义为坐标点 S el e ct C h an n el用于选择要显示的波形通道,
(60+scrollspeed,0),右下角定义为坐标点(1021,750)。
wave
x
compressrate用于设置显示波形的压缩率,
然后通过调用函数BltFast()将主缓存lpDDSPrimary上
positionlefl代表波形显示的当前位置。在该函数中通过
的(60+scrollspeed,0)至(1021,750)范围内的部分复制
调用函数point()在辅缓存右侧画出16路新的波形曲线。
到辅缓存lpDDSBack,其位置点是(60,0)。由于位块复 通过调用函数drawplaybackpointsleft(),已将主缓
制是一个异步过程,所以须通过一个while循环来判断 存的内容向左移动了scrollspeed个点复制到辅缓存,并
复制是否已完成,如果是的话跳出循环,否则继续执行 且在辅缓存的右侧空白区域填上了新的波形。
复制操作。 1.6页面的翻转
1.5写辅缓存
在DirectX中,页面翻转的作用是将辅缓存变成主缓
经过上一步的移位复制,在辅缓存的右边留下了
存,在屏幕上显示出来,而原来的主缓存则变为辅缓存。
一
小块空白区域,需要画上新的波形数据。在
通过调用lpDDSPrimary一>Flip(NULL,0)进行翻
DirectDraw表面上画图的方法有两种:调用GDI函数
转,如果翻转成功,则返回DD—OK,若是系统繁忙,则
和直接写显存。GDI函数法简单方便,但速度慢;而
返回DDERR_WASSTILLDRAWING。由于这是一个
直接写显存效率高,速度快,但缺乏绘图函数,使用
异步过程,所以须用while循环来判断转换是否完成,完
较麻烦。我们在静态图形和文字显示部分采用了GDI 成则跳出循环,否则继续调用Flip函数。经过页面翻
函数法,而滚动图形的显示部分采用了直接写显存法。
转,即将后台缓冲区翻转成主表面,其内容显示在屏幕
下面对这两种方法分别加以介绍:
上,而原先的主缓存变成辅缓存。不断重复以上的“位
1.5.1 GDI函数法
块移位复制一写辅缓存一页面翻转”循环,就能实现波
GDI函数是Windows提供的专门用于画图的函 形的平滑滚动。
数,由一系列函数组成,可以画点、直线、椭圆、文字
1-7释放DirectDraw对象和表面
等图形。首先通过调用lpDDSPrimary一>GetDC(&hdc) DirectDraw程序运行结束时,需要释放所创建的对
将主缓存锁定,并得到句柄hdC。然后通过函数 象和表面。程序检测DirectDraw对象的指针(1pDD)和
维普资讯
●
DirectDrawSurface对象的指针(1pDDSPrimary),是否等
于N u LL,本例中显然不为NuLL。然后调用
I D i r e c t D r a w S u r fa c e::R e 1 e a s e,方法将
DirectDrawSurface对象的参考值减1,这将会使其参
考值变为0,DirectDrawSurface对象就被释放了。
环境下高分辨率的波形高速滚屏显示。DirectX中的
快速位图复制函数和高效的直接写显存机制,是保证
波形能够高速平滑滚动不出现闪烁的关键。对于改进
医疗仪器的显示效果具有实用价值。
值得注意的是显示卡上的显存大小和类型,对于
本方法的显示效果有明显的影响。如果只有8M显存
的话,将无法支持1280×1024的分辨率,所以必须要
DirectDrawSurface的指针被设为NULL值,然后撤消。
程序又调用IDirectDraw::Release,将DirectDraw对象
的参考值减1变为0,释放DirectDraw对象及其指针。
有16M以上的显存。另外,显存的类型必须是SGRAM
或SDRAM或者更快的DDR RAM,而EDO型的显存
我们用Intel Pentium III 800 PC机,内存为256M
因为存取时间(30ns左右)比SGRAM(10ns左右)长,很
sDRAM,显示卡为ATI 9000,操作系统为
多导致速度跟不上,表现在波形快速滚动时会出现随机
WindowsXP和MS—DOs6.22,屏幕分辨率为1280×
的抖动现象.好在现在生产的显卡大都具备上述条件。
1024,同屏显示16路波形(占满整个屏幕),分别运行
本显示方法的不足之处在于只能实现全屏模式下
DirectX滚动显示程序和DOS滚动显示程序进行测
的波形滚动,而做不到窗口模式下的滚动显示。这是
试,测得数据如表2。
由于本方法中使用了页面翻转技术,而微软的DirectX
表2两类程序的显示参数比较
规范中限定只有在全屏模式下才能使用页面翻转所
Tab.2.A comparison of ̄sphy parameters between 2 types of ̄ograms
至。我们正在寻找其它方法,解决窗口模式下的波形
滚动问题。
参考文献
从实验数据可以看出,基于DirectX的滚屏显示软
[1】Microsoft DirectX SDK Document.Microsoft Corporation,1997
[2】layton Walnum,et 1a.Windows95 Games SDK Strategy.QUE
件的画面刷新率高出DOS程序30%,能够实现最快1
Corporation.1997
米/秒的刷新率,有利于显示快速变化的生理信号。
[3】Special Edition Using Visual C++5.QUE Corporation.1997
[4】谭德强,姜波主编.实用软件工具与环境教程一c++高级编
本显示方法充分利用了微软DirectX规范中的位
程.清华大学出版社,2002
[5】王萍编著.c++面向对象程序设计,清华大学出版社,2003
块复制,直接写显存和页面翻转功能,实现了Windows
■■一
号作为检测的对象,运行的界面如图4所示,图中显
Wavelet Transforms.IEEE Trans on B medical Engineering.1995.
示了三导联的心电信号,并标注了R波的位置,计算
42:21-28
[2】李桥,等.基于小波变换的QRS波群实时检测算法.中国医学物理
出了心率。
学杂志,2004,2l(2):109一ll2
【3】S.Mallat.YA.Theory for Multiresolution Signal Decomposition:
本文提出了一种基于小波变换的QRS波检测方
hTe Wavelet Representation.IEEE Trans on Pattern Analysis nad
法,并使用MIT—BIH数据库验证,准确率达到99.5%。
Machine Intelligence,1989,l 1(7):257—263
[4】S.Mallat.Characterization of Signals from Mulitscale Edges.IEEE
采用循环缓冲方式和三阶样条小波计算心电信号的小
Trans on Pattern Analysis nad Machine nItelligence,1992,14:710—
波变换,从而使得延迟时间短,计算量小,非常适合
732
在嵌入式系统上实现QRS波的实时检测。同时小波变
[5】S.Mallat,W.L.Hwang.Singularity Detcetion nad Processing with
换不仅可以用于QRS波的识别,还可以用于心律失常
Wavelets.IEEE Trans on nIformation hTeory,1992,38:617—643
[6】S.Mallat.Zero—Crossnigs of Wavelet Trnasform.IEEE Trans on
的判别和分类,这都是接下来具有重要意义的工作和
nIformation hTeory,l999,37(4):10l9一l033
研究方向。
[7】周霖,等.算法设计与系统实现.国防工业出版社,2004
参考文献
[8】John G.Ackenhusen.实时信号处理—信号处理系统的设计与实
[1】Cuiwei Li et 1a.Detection of ECG Characteristic Points Using
现.电子工业出版社,2002


发布评论