vxworks 双缓冲

WindML提供了2D图形的解决方案.但在某设备信息化改造项目中。由于需要实时采集 、显示虚拟仪表图形信息、驾驶员终端显示综合控制信息 、车内各设备状态信息车长命令、报警等 。都需要实时绘制画面,每次采集到数据和各信息互相切换都要刷新画面。画面闪烁、抖动比较剧烈.因此可以把在显示时不变化的信息以位图背景的形式保存 ,调用(uglDefault—BitmapSet0)来实现,在此背景上来动态刷新变化的仪
表指针、设备状态 、报警等。这样在刷新画面时数据量减少,画面的效果有所改善,但是由于采集到的数据 、状态等是实时变化,画面闪烁、抖动存在。视觉效果不佳 ,本文应用 WindML的双缓冲技术来解决这一问题 。
双缓冲技术是指不改变可见视频缓存区起始地址,而是在内存中开辟一块与屏幕一样大小的存储区域 ,作为缓冲屏幕,同时将下一帧要显示的图像绘制到这个缓冲屏幕上面,在显示的时候将虚拟屏幕中的数据直接复制到可见视频缓存区里。由于图形绘制过程是在不可见的虚拟屏幕中进行.所以可以消除屏幕的闪烁 、抖动。 以虚拟仪表图形信息显示为例:在具体的实现中,让仪表指针、设备状态、报警等的过程在Off_Screen(后台)实现。即在绘制当前图形信息的时候 。调用函数uglPageDrawSet()另外指定绘制下一图形操作的页面(缓冲)。在绘制完成后,再通过 uglPagevisableSet()把Off-Screen的图像拷贝到前台,即实现图像的刷新,这就可以有效的解决图像闪烁 、抖动问题。具体实现如下 :
page[0]=UGL_PAGE_ZERO—ID;
page[1]=uglPageCreate(devId);  //建双缓冲页
bgBitmap="uglBitmapCreate" (devld,&XNBPDib,UGL_DIB_INIT_DATA,0,UGL_NULL);//由位图数据信息创建位图
uglDefaultBitmapSet(gc,bgBitmap);//设 置 bgBitmap为画图背景
uglPageDrawSet(devld,page[1]);//设置活动的绘图双缓冲(页)
uglBitmapBh (gc, DisplayBitmap,0,0,16,16, UGL_DEFAULT_ID,0,0);
… … … … . .
//在变化的位置绘制的位图和其它具体图形绘制
uglPageVisibleSet(devld,page[1]);//在前台显示
uglPageDrawSet(devId,page[O]);//后台绘制下一图像
uglPageVisibleset(devId,page[0]);  像在前台显示
uglPageDrawSet(devId,page[1]);后台绘制下一图像
… … … … … … … … … …

uglPageDestroy(devld,page[1]);//释放缓冲

posted @ 2011-10-15 11:45  逆时针  阅读(790)  评论(0编辑  收藏  举报