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

转载 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实际上并不神秘,其内部细节也能够想清楚。

相关文章推荐

Java双缓冲技术

从 http://blog.csdn.net/kai_wei_zhang/article/details/8120382 转载

深入理解iPhone屏幕双缓冲技术

深入理解iPhone屏幕双缓冲技术(手把手教你iphone开发 - 基础篇) 作者:孙东风 2009-12-21(转载请注明出处)   笔者在最近项目的开发中需要使用到“屏幕双缓冲”技术,“...

双缓冲技术绘图

之前在做图形绘制的时候,发现在拖动图形时候,会出现闪烁的情况,后来就上网找了一下shuanghuan

Java双缓冲技术

转载自:http://blog.csdn.net/kai_wei_zhang/article/details/8120382 Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色。在Jav...

深入理解iPhone屏幕双缓冲技术

笔者在最近项目的开发中需要使用到“屏幕双缓冲”技术,“屏幕双缓冲”是GUI客户端中最经常使用的一种技术,但是这种技术在iPhone平台似乎很少被人使用到,网上的资料基本很难找到,这点让笔者很是不解:(...

Android开发之用双缓冲技术画图

Android开发之用双缓冲技术画图

Qt的双缓冲技术(double buffering)

Qt的双缓冲技术(double buffering)是Qt绘画机制的一部分,是一种在Qt4中被全面采用的技术。其核心是:把一个窗口部件渲染到一个脱屏pixmap(off- screen pixma...

雙緩沖技術(C# GDI)

http://blog.csdn.net/gisfarmer/article/details/4366707 c#如何實現防窗體閃爍的功能。大家都會想到運用雙緩沖技術,那麼在c#中是如何做的...

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

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

VC 绘图,使用双缓冲技术实现

VC 绘图,使用双缓冲技术实现VC++ 2009-12-06 21:32:24 阅读1042 评论1  字号:大中小 订阅***************************************...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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