浅谈双缓冲技术和页交换技术及其区别

转载 2006年05月28日 21:39:00

    从速度上来讲页交换操作更快一点。

    我最先接触页交换是在学DirectX的时候。出现页交换技术是因为SVGA卡的视频缓存已经足够的大了,一般都是8M以上,现在主流显示卡则能达到128M。这样大的显存除了用于可见屏幕的显示,还有大量的剩余,这剩余的显存则可以用于存储暂时不显示在屏幕上的位图。VGA/SVGA系统的结构下,视频缓存所分配到的地址(十六位下)都是0xA000:0000-0xA000:FFFF的64K和0xB000:0000-0xB000:FFFF的64K。其中前一个称为A窗口用于图形模式,后一个称为B窗口用于文本模式。VGA/SVGA系统的另一个特点就是通过寄存器编程或BIOS调用可以改变可见视频缓存区在视频缓存中的起始位置,这个就是页交换技术实现的硬件基础。

    所谓的页交换,就是改变了可见视频缓存区在视频缓存中的起始位置。假如一个视频模式,需要256K的视频缓存,而视频缓存为8M。在初始化视频模式,一般都会把可见视频缓存区的位置设置为视频缓存的零偏移处,这样显存中 0-256k的数据将被显示到屏幕上面。而8M的显存总共可以有32个256K,几可以有32个虚拟的或者说不可见的屏幕,在这些区域内写如数据是不会被显示到屏幕上的。

    由于可以改变可见视频缓存区的起始位置,我们就可以将显示卡中多余的视频缓存当作虚拟屏幕来使用。将希望在下一帧显示的位图直接绘制在虚拟屏幕上面,当要显示的时候,直接改变可见视频缓存区的起始位置到虚拟屏幕的起始地址就可以了。也就是通常所说的页交换(Page Clip)。在DirectX里面就是这样实现的。

    双缓冲则是另外一个不同的方法。它不改变可见视频缓存区起始地址,而是在内存或显存中开辟一块与屏幕一样大小的存储区域,作为缓冲屏幕,这和页交换是类似的。同样也是将下一帧要显示的图象绘制到这个缓冲屏幕上面,不同的是在显示的时候不是改变可见视频缓存区起始地址,而是将缓冲屏幕中的数据直接复制到可见视频缓存区里面去。由于图形绘制过程是在不可见的缓冲屏幕中进行,所以可以消除绘制图形时屏幕的闪烁。但由于要复制大量的数据,速度可能就会馒一些。不过双缓冲也有其优点,就是它可以保证实际屏幕与缓冲屏幕数据的一致性。而页交换技术则不行。

    双缓冲中的缓冲屏幕一般都建立在内存中,而不是在视频缓存中。如果硬件提供显存到显存的读写操作,速度绝对比建立在内存中快,因为内存到显存的读写要经过系统总先,而显存到显存的读写(如果硬件支持的话)则不需要通过系统总线。然而这种显存到显存的读写并没有写进VESA文挡,并不是一个标准的办法,所以并不是所有的显卡都能提供这种显存到显存的读写。如果硬件不支持显存到显存的读写操作,则可以先将显存中某一块区域的数据复制到内存,再从内存复制到显存中的另一块区域,就需要两次复制,两次经过系统总线,所以,将缓冲屏幕建立在显存中的麻烦是可想而知的。由于显存到显存的读写操作不是标准的操作,所以通常不将缓冲屏幕建立在显存中。在DirectX中也曾经提到,DirectDraw会尽量获取硬件加速,某些特性如果硬件不支持,则DirectDraw会对其采用软件模拟的办法,我想大概说的就是这个吧。

    当然,由于存储容量越来越大,就可以定义实现多页面的页交换技术和多缓冲技术。在双缓冲或多缓冲中,由于可以保证数据的一致性,如果再实现了一个高效率的Blt,则可以进一步实现更加高效率的脏矩形技术(Dirty Rectangle),从而实现只对改变了的区域进行绘制,效率会更高。

    在存储器的使用方面,也不难知道,页交换技术使用的主要是显存,而不能使用内存做页交换;双缓冲技术通常使用的是内存,但也可以使用显存,并且,如果硬件支持显存到显存的读写,使用显存作缓冲屏幕,速度会很快,但是如果硬件不支持,则速度会很慢,并且实现起来会很麻烦。


    如果仔细研究过VGA/SVGA系统的话应该能够理解双缓冲、页交换等概念。DirectX里面的一些技术的内部细节也能够想的清楚。DirectX中的DirectX实际上并不神秘,其内部细节也能够想清楚。

双缓冲技术讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年05月15日 17:49
  • 2264

MFC_双缓冲技术

双缓冲技术
  • a7055117a
  • a7055117a
  • 2015年08月31日 13:20
  • 1308

Java中用双缓冲技术消除闪烁

在Java编写具有连贯变化的窗口程序时,通常的办法是在子类中覆盖父类的paint(Graphics)方法,在方法中使用GUI函数实现窗口重绘的过程。连贯变换的窗口会不断地调用update(Graphi...
  • lodog1
  • lodog1
  • 2015年07月22日 19:27
  • 1405

C++双缓冲技术

在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕...
  • CNHK1225
  • CNHK1225
  • 2015年09月21日 14:20
  • 1128

关于GDI+的那些事(1)——效率、双缓冲

一年来做了一些图像相关的工作,
  • obmar45
  • obmar45
  • 2014年07月01日 12:02
  • 800

双缓冲技术解决屏幕刷新闪烁

1. 屏幕刷新时产生闪烁的原因 在MFC对话框上画图形,当需要显示新的图形或使原来的图形显示发生变化时,就需要刷新背景,也就是用背景颜色的画刷把背景重新刷一遍,这样就把原来的图形覆盖掉了,然后画...
  • Sacomplex
  • Sacomplex
  • 2016年12月03日 16:13
  • 1074

Java双缓冲技术详解

Java双缓冲技术 返回 存档 删除 添加到收藏夹 分享 显示选项 Pocket 我的列表添加到收藏夹存档列表 文本视频图像标签 › Careers at Pock...
  • qq_33456887
  • qq_33456887
  • 2016年07月08日 16:06
  • 662

win32下双缓冲原理及实现

一:双缓冲原理   为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图。所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(...
  • aoyuanyuan
  • aoyuanyuan
  • 2016年09月19日 15:20
  • 1134

mfc下实现双缓冲的方法

本帖解决的问题:     如何实现双缓冲 ?     为什么实现了双缓冲还是会闪烁? 以下资料为本人积累和加上自己的经验 1、简介一下windows mfc的view显示刷新过...
  • lemoncatYang
  • lemoncatYang
  • 2014年10月09日 10:54
  • 1175

双缓冲(Double Buffer)原理和使用

一、双缓冲作用            双缓冲甚至是多缓冲,在许多情况下都很有用。一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的。这样的情况在很多地方后可能会发生,使用多缓冲...
  • acs713
  • acs713
  • 2013年11月16日 18:50
  • 27238
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈双缓冲技术和页交换技术及其区别
举报原因:
原因补充:

(最多只允许输入30个字)