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

24小时学DX之第三小时——双缓冲 #include "stdafx.h"#define INITGUID#include #define SafeRelease(x) if (x) { x->Release(); x=NULL; }#define IMAGE_COUNT 6 //图片数目?char file_names[IMAGE_COUNT][256] = {?? ?"E:/CJD/素材/pic/魔兽/1.bmp", 阅读详情

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

    我最先接触页交换是在学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高级讲师,优快云社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.youkuaiyun.com/lecturer/144 首先要搞清楚计算机运行原理,计算机载运行时是将将最大的任务分解成多个任务,然后一个接一个地执行。 阅读详情

相关推荐

COT Buck和普通Buck的区别

传统的电流模控制的调制原理,由时钟脉冲信号 clk 的上升沿触发开始一个新的开关周期,d 由低变高,主开关闭合,流过它的电流和电感电流相等,并以固定斜率逐渐增大,直至 iL *Ri 与斜坡补偿信号 se 的和等于控制信号 vc;此时,比较器的输出电平由低变高,导通时间产生器被触发,其输出 d 由低变高,并产生一个固定的导通时间 Ton;然后 PWM 比较器的输出由低变高,导通时间产生器被触发,主开关闭合,电感电流逐渐增大,直到导通时间产生器计满固定的时间 Ton,d 变为低电平,主开关断开,周期结束。

模拟芯片设计 1125

[转]Direct Draw及双缓冲(Symbian开发)

Direct Draw.      试用窗口服务在屏幕上Draw需要一个连接文件来转换,这样大大降低了速度.绕过窗口服务,丢弃连接文件的转换,让应用程序自己来直接存取屏幕,这就叫做

智能移动开发技术分享乐园 2749

MaixCAM2 4K AI相机硬件解析与开发实战

嵌入式AI视觉开发中,边缘计算设备的选择直接影响项目落地效果。以NPU为核心的AI加速技术通过专用指令集优化,可在低功耗下实现10+TOPS算力,典型应用包括工业质检、智能门禁等实时场景。MaixCAM2作为新一代4K AI相机,搭载AX630 SoC芯片,其双核Cortex-A53与NPU的异构架构,在运行YOLOv11n模型时可达113FPS,显著优于传统方案。开发时需注意模型量化部署技巧,如INT8量化需500+张校准图片覆盖多光照条件,避免准确率下降。设备扩展性方面,PMOD接口支持热成像、ToF传

weixin_30819085的博客 689

双缓冲技术

双缓冲技术 在离屏缓冲绘制图像,然后将其拷贝到显示表面的处理过程被称作双缓冲技术。 实现:额外的一块同主DirectDraw表面具有同样尺寸的内存。并在这块内存上画每一帧动画之后拷贝双内在到主显示表面。 如:申请640X480X8的内存UCHAR *double_buffer = (UCHAR *) malloc (640*480);或者UCHAR *double_buff...

weixin_30463341的博客 215

Ubuntu终端接入Codex:一行脚本搞定AI编程助手安装与配置

在开发者日常工作中,命令行终端是最高频的操作环境,而AI编程助手的出现正在改变传统的编码方式。通过将大模型能力与终端工具链结合,开发者无需切换窗口即可完成命令查询、代码生成、项目理解和自动执行等任务。Ubuntu作为服务器和开发机的主流系统,搭配Node.js生态和API Key认证,即可在本地闭环运行AI助手。本文从环境准备、密钥配置、权限管理到自动化脚本封装,系统拆解在终端中接入Codex的完整流程,并分享高频用法与实测排障经验,帮助开发者安全、高效地让AI融入命令行工作流。

weixin_29061041的博客 321

模型优化系列——模型剪枝/量化概述

模型优化目的:通过减少模型大小,提高推理速度等使模型成功部署在各个硬件中并实时有效运作。

qq_61210574的博客 1293

DirectDraw高彩模式编程入门

 目 录  1 图形编程基本常识  2 DirectDraw的简单概念  3 DirectDraw的初始化代码  4 高彩下的画点函数--------------------------------------------------------------------------------  本来是应该从256色模式下的编程谈起的,但现在大家写游戏都喜欢用高彩模式,那我就顺因大势所趋,直接讲讲

songok2007的专栏 881

Cursor使用教程,有点难

Cursor Code Editor 不仅仅是一个代码编辑器,它更是一个集成了 AI 的全功能开发环境,帮助你从代码编写到优化的整个过程变得更加智能和高效。它通过内置的 AI 代码补全、错误检测和自动修复功能,大大减少了手动编写代码的负担,帮助你快速完成开发任务。同时,Cursor 还与多种前沿的 AI 大模型集成,包括 OpenAI 的 GPT-4o、Claude 3.5 和 Meta 的 Llama 3.1。

xiaofeitunAI的博客 1万+

svga文件预览_直播礼物SVGA格式如何优化

最近在直播间礼物动效设计中,用到了SVGA格式作为输出文件,但是这部分内容在网上的资料比较少,而且很多文章里面介绍的并不详细,在实际操作过程中又碰到了很多的麻烦,这也是我把导出SVGA的经验总结并分享给大家的原因,希望能够帮助到大家。01关于SVGA文件1SVGA文件支持的特效SVGA文件具有较低的运行内存和较好的稳定性的优点。但是SVGA文件比较傲娇,能够支持的效果很少,我们先大概了...

weixin_30991735的博客 7953

基于OkHttp3+Retrofit2+RxJava3搭建响应式网络框架

本文介绍了一个基于OkHttp3+Retrofit3+RxJava3的响应式网络框架设计。该框架采用分层架构,OkHttp3负责底层网络请求,Retrofit3封装HTTP接口,RxJava3实现响应式流处理。核心亮点包括:1)高度解耦的分层设计;2)统一的异常处理和响应体封装;3)RxJava3实现线程切换和请求管理;4)MVVM架构适配,业务层只需关注数据逻辑。框架提供了完整的实现方案,包括全局配置、拦截器、响应转换、接口声明、仓库封装等组件,并支持生产环境扩展功能如Cookie持久化、Token刷新等

fuge2008的博客 870

AD4030-24BBCZ详细资料 Analog Devices 模数转换器 - ADC 24-Bit, 2 MSPS, SAR ADC

AD4030-24BBCZ详细资料  Analog Devices 模数转换器 - ADC 24-Bit, 2 MSPS, SAR ADC

Chen_YYan的博客 794

C++ 双缓冲区生产者-消费者

双缓冲区(Double Buffering)是一种用于优化多线程或并发环境中数据生产和消费性能的技术。它通过使用两个缓冲区(前缓冲区和后缓冲区)来减少线程间的竞争和锁的使用,从而提高吞吐量。核心思想是生产者向写缓冲区写入数据,消费者从读缓冲区读取数据,当写缓冲区满或读缓冲区空时,交换两个缓冲区。双缓冲区的优点包括减少锁竞争、提高效率和适用于实时数据处理等场景,但也存在内存使用增加和实现复杂度较高的缺点。在C++中,双缓冲区可以通过互斥锁和条件变量实现线程安全,并通过交换缓冲区来协调生产者和消费者的操作。双缓

休息一下接着来的博客 1230

用野火FPGA开发板(EP4CE10)手把手教你实现一个高精度频率计(附完整Verilog代码)

本文详细介绍了基于野火FPGA开发板(EP4CE10)实现高精度频率计的全过程,涵盖等精度测量法的核心原理、Verilog代码实现及优化技巧。通过实际案例演示,帮助开发者掌握1Hz-50MHz范围、精度达0.1%的频率计设计方法,并提供完整的工程代码和实测数据。

weixin_29261711的博客 439

DDraw笔记-双缓冲和后备缓冲

双缓冲和后备缓冲 前面的例子都是,直接在主表面上绘东西。对于动画,直接在主表面上绘,会产生很严重的闪烁。解决的办法是采用双缓冲或后备缓冲。 双缓冲 双缓冲:在离屏缓冲中绘制图像,然后将其拷贝到显示表面。 见下面代码,先把数据放到double_buffer,最后再拷贝到主表面上。 下面Sleep(300);睡眠了0.3秒这么长的时间是为了更为明显的看到画面的变化。 代码下载 ...

weixin_30662109的博客 241

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

屏幕帧缓冲机制

屏幕多缓冲显示通常涉及帧缓冲(Framebuffer)的使用,这是一块与屏幕大小和分辨率相关联的内存区域。在图形用户界面(GUI)中,所有绘制操作都是通过对帧缓冲的操作完成的,这些操作包括内存设置(memset)和内存复制(memcpy)。这些操作的速度直接影响到帧缓冲的处理速度,因此为了优化性能,开发者通常会编写多个版本的 memset 和 memcpy。

好作息,好心态,多锻炼,多学点,多钻研 1783

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

双缓冲区

通常对同一块数据读写需要加锁,如果写的情况多且比较耗时的话,那读的时候就比较慢。所有这时候可以考虑用双缓冲区用指针切换,虽然切换的时候也需要加读写锁,但是提升效率是明显的。 ...

gbbfum的博客 289

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FrameBuffer初探

1, 在前面Android系统的开机画面显示过程分析一文中提到,Linux内核在启动的过程中会创建一个类别和名称分别为“graphics”和“fb0”的设备。 这样就可心看到LCD显示出fb0的内容   2,清屏的动作:   3,双缓冲介绍 最早解释多缓冲区如何工作的方式,是通过一个现实生活中的实例来解释的。在一个阳光明媚的日子,你想将水池里的水换掉,而又找不到水管的时候,

可夫小子的频道 1630

OpenGL学习03_双缓冲DoubleBuffering

双缓冲的是什么? 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscre

CC专栏 7383

LR测试结果分析参数说明

平均事务响应时间   AverageTransation Response Time 优秀:<2s   良好:2-5s    及格:6-10s   不及格:>10s 每秒点击率   Hits perSecond   当增大系统的压力(或增加并发用户数)时,吞吐率和TPS的变化曲线呈大体一致,则系统基本稳定。若压力增大时,吞吐率的曲线增加到一定程度后出现变化缓慢,甚至平坦,很...

Clown01的博客 3871

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

作者:孙东风 原文地址 http://blog.youkuaiyun.com/dongfengsun/archive/2009/12/22/5053418.aspx 笔者在最近项目的开发中需要使用 到“屏幕双缓冲”技术,“屏幕双缓冲”是GUI客户端中最经 常使用的一种技术,但是这种技术在iPhone平台似 乎很少被人使用到,网上的资料基本很难找到,这点让笔者很是不解:( ...

weixin_30475039的博客 129

Android SurfaceView 绘图覆盖刷新及“.NET研究”脏矩形刷新方法

  SurfaceView在Android中用作游戏开发是最适宜的,本文就将演示游戏开发中常用的两种绘图刷新策略在SurfaceView中的实现方法。   首先我们来看一下本例需要用到的两个素材图片:   bj.jpg就是一个渐变图,用作背景。   question.png是一个半透明的图像,我们希望将它放在上面,围绕其圆心不断旋转。   实现代码如下: package SkyD.Surface...

weixin_34085658的博客 247

双缓冲技术原理以及优缺点

创建一幅后台图像,将每一帧画入图像,然后调用 drawImage()方法将整个后台图像一次画到屏幕上去。 优点:双缓冲技术的优点在于大部分绘制是离屏的。将离屏图像一次绘至屏幕上,比直接在屏幕上绘制要有效得多。双缓冲技术可以使动画平滑。 缺点:要分配一个后台图像的缓冲,如果图像相当大,这将占用很大一块内存。 Java GUI库画图时实现双缓冲: ...

fancky58的博客 5502
上一篇: 关于A算法
下一篇: 算10000以内数阶乘的C语言程序
ranber
博客等级 码龄22年 4粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值