精华内容
下载资源
问答
  • 什么叫做双缓冲

    千次阅读 2014-03-24 17:11:31
    双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另...
    双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。
    展开全文
  • OpenGL单缓冲与双缓冲的区别

    千次阅读 2017-10-18 10:28:17
    而所谓双缓冲就是再这个显示的缓冲区 之外 再建立一个不显示的缓冲区,我们所有的绘图都将在这个不显示的缓冲区中进行,只有当一帧都绘制完了之后才会被拷贝到真正的现实缓冲区显示出来,这样中间过程对于最终

    单缓存和双缓存

    在我们电脑中,屏幕中显示的东西都会被放在一个称为显示缓存的地方,在通常情况下我们只有一个这样的缓冲区即单缓冲,在单缓冲中任何绘图的过程都会被显示在屏幕中,这也就是我们为什么会看到闪烁。而所谓双缓冲就是再这个显示的缓冲区之外再建立一个不显示的缓冲区,我们所有的绘图都将在这个不显示的缓冲区中进行,只有当一帧都绘制完了之后才会被拷贝到真正的现实缓冲区显示出来,这样中间过程对于最终用户就是不可见的了,那即使是速度比较慢也只会出现停顿而不会有闪烁的现象出现。

    单缓存:帧缓存区开辟一个屏幕绘图缓存区。
    双缓存:帧缓存区开辟两个屏幕绘图缓存区,交替使用,便于动画绘制 。
    可以通过以下方法来设置窗口的展示模式为单缓冲或双缓冲

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glFlush(); //单缓冲的刷新模式;
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutSwapBuffers(); //双缓冲的刷新模式;

    一般用OpenGL绘图都是用双缓冲,单缓冲一般只用于显示单独的一副非动态的图像。

    使用深度测试函数:

    在解决了闪烁的问题之后,我们来解决另一个问题:首先我们在窗口中画两个交叉的分别位于ZOX 和 ZOY 平面的长方形,并用不同的颜色填充它们,然后让它们旋转很快我们发现有个比较严重的问题,因为我们发现OpenGL显然没有空间的位置观念,因为它根本不能分辨物体的前后关系,当然也不能做出适当的显示。在OpenGL中我们使用深度缓冲区来解决这个问题,在这个缓冲区中存放着每个象素深度信息,当有一个新的象素需要显示的时候,我们可以通过一个被称为深度测试的函数来确定它们的先后关系。

    • 使用 glEnable(GL_DEPTH_TEST)。在默认情况是将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。
    • 但是可以使用glDepthFunc(func)来对这种默认测试方式。其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)GL_NOTEQUAL(不等于),其中默认值是GL_LESS。
    • 一般来讲,使用glDepthFunc(GL_LEQUAL);来表达一般物体之间的遮挡关系。
    • 启用了深度测试,那么这就不适用于同时绘制不透明物体。
    展开全文
  • Qt5双缓冲机制

    千次阅读 2016-03-10 15:13:04
    所谓双缓冲机制,即在绘制控件时,首先要将绘制的内容绘制在一个图片中,再将图片一次性绘制到控件上。在早期的Qt版本中,若直接在控件上进行绘制,则在控件重绘时会产生闪烁的现象,控件重绘频繁,闪烁尤为明显。...

    所谓双缓冲机制,即在绘制控件时,首先要将绘制的内容绘制在一个图片中,再将图片一次性绘制到控件上。在早期的Qt版本中,若直接在控件上进行绘制,则在控件重绘时会产生闪烁的现象,控件重绘频繁,闪烁尤为明显。双缓冲机制可以有效地消除这种闪烁现象。自Qt5版本之后,QWidget控件已经能够自动处理闪烁的问题。因此,在控件上直接绘图时,不用担心显示的闪烁问题。,但双缓冲机制在很多场合仍然有其用武之地,当所需绘制的内容比较复杂并需要频繁刷新,或者每次只需要刷新整个控件的一小部分,仍尽量采用双缓冲机制。

    展开全文
  • 这是目前(截止2013年5月)唯一一篇双缓冲主题的硕士论文,比较难找。 内容还算系统,基本上讲清楚了思路,给出了实现的路子。
  • 双缓冲(Double Buffer)原理和使用

    万次阅读 多人点赞 2013-11-14 20:21:57
    一、双缓冲作用    双缓冲甚至是多缓冲,在许多情况下都很有用。一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的。这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决。我...

    一、双缓冲作用
         
         双缓冲甚至是多缓冲,在许多情况下都很有用。一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的。这样的情况在很多地方后可能会发生,使用 多缓冲可以很好的解决。我举几个常见的例子:

         例 1. 在网络传输过程中数据的接收,有时可能数据来的太快来不及接收导致数据丢失。这是由于“发送者”和“接收者”速度不一致所致,在他们之间安排一个或多个缓冲区 来存放来不及接收的数据,让速度较慢的“接收者”可以慢慢地取完数据不至于丢失。

          例2. 再如,计算机中的三级缓存结构:外存(硬盘)、内存、高速缓存(介于CPU和内存之间,可能由多级)。从左到右他们的存储容量不断减小,但速度不断提升,当然价格也是 越来越贵。作为“生产者”的 CPU 处理速度很快,而内存存取速度相对CPU较慢,如果直接在内存中存取数据,他们的速度不一致会导致 CPU  能力下降。因此在他们之间又增加的 高速缓存来作为缓冲区平衡二者速度上的差异。

          例3. 在图形图像显示过程中,计算机从显示缓冲区取数据然后显示,很多图形的操作都很复杂需要大量的计算,很难访问一次显示缓冲区就能写入待显示的完整图形数据,通常需要 多次访问显示缓冲区,每次访问时写入最新计算的图形数据。而这样造成的后果是一个需要复杂计算的图形,你看到的效果可能是一部分一部分地显示出来的,造成很大的闪烁不连贯。 而使用双缓冲,可以使你先将计算的中间结果存放在另一个缓冲区中,但全部的计算结束,该缓冲区已经存储了完整的图形之后,再将该缓冲区的图形数据一次性复制到显示缓冲区。

          例1 中使用双缓冲是为了防止数据丢失,例2 中使用双缓冲是为了提高 CPU 的处理效率,而例3使用双缓冲是为了防止显示图形时的闪烁延迟等不良体验。

    二、双缓冲原理

         这里,主要以双缓冲在图形图像显示中的应用做说明。  
         
        上面例3中提到了双缓冲的主要原理,这里通过一个图再次理解一下:

         图 1  双缓冲示意图

         注意,显示缓冲区是和显示器一起的,显示器只负责从显示缓冲区取数据显示。我们通常所说的在显示器上画一条直线,其实就是往该显示缓冲区中写入数据。 显示器通过不断的刷新(从显示缓冲区取数据),从而使显示缓冲区中数据的改变及时的反映到显示器上。

         这也是显示复杂图形时造成延迟的原因,比如你现在要显示从屏幕中心向外发射的一簇射线,你开始编写代码用一个循环从0度开始到360度,每隔一定角度画一条从圆 心开始向外的直线。你每次画线其实是往显示缓冲区写入数据,如果你还没有画完,显示器就从显示缓冲区取数据显示图形,此时你看到的是一个不完整的图形,然后你 继续画线,等到显示器再次取显示缓冲区数据显示时,图形比上次完整了一些,依次下去直到显示完整的图形。你看到图形不是一次性完整地显示出来,而是每次显示一部分,从而造成闪烁。

         原理懂了,看下 demo 就知道怎么用了。下面先介绍 Win32 API 和 C# 中如何使用双缓冲,其他环境下由于没有用到所以没写,等用到了再在下面补充,不过其他环境下 过程也基本相似。

    三、双缓冲使用 (Win32 版本)
        
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC hDC, hDCMem;
    	HBITMAP hBmpMem, hPreBmp;
    	switch (message)
    	{
    	case WM_PAINT:
    		hDC = BeginPaint(hWnd, &ps);
    		
    		/* 创建双缓冲区 */
    		// 创建与当前DC兼容的内存DC
    		hDCMem = CreateCompatibleDC(hDC);		
    		// 创建一块指定大小的位图
    		hBmpMem = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);		
    		// 将该位图选入到内存DC中,默认是全黑色的
    		hPreBmp = SelectObject(hDCMem, hBmpMem);	
    		
    		/* 在双缓冲中绘图 */
    		// 加载背景位图
    		hBkBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));	
    		hBrush = CreatePatternBrush(hBkBmp);
    		GetClientRect(hWnd, &rect);
    		FillRect(hDCMem, &rect, hBrush);
    		DeleteObject(hBrush);
    		
    		/* 将双缓冲区图像复制到显示缓冲区 */
    		BitBlt(hDC, 0, 0, rect.right, rect.bottom, hDCMem, 0, 0, SRCCOPY);
    		
    		/* 释放资源 */
    		SelectObject(hDCMem, hPreBmp);
    		DeleteObject(hMemBmp);
    		DeleteDC(hDCMem);
    		EndPaint(hWnd, &ps);
    		break;
    	}
    }

        使用 Win32 版本时注意释放资源,释放顺序与创建顺序相反。我在使用过程中不小心遗漏了一句上面的 "DeleteObject(hMemBmp);"导致图形显示一段时间后就卡死了, 查看内存使用发现内存随时间推移飙升,加上上面这句代码后,就没这个问题了。这也再次提醒我们释放资源是多么重要,成对编程的习惯是多么重要。


    图 2  处理几次 WM_PAINT 消息后内存变化图

         在使用过程中,如果想更新使用双缓冲区显示的区域,可以使用 InvalidateRect(hWnd, &rect,  FALSE); ,这里要注意第三个参数一定要设置成 FALSE ,第三个参数表示更新第二个 参数指定的区域时是否擦除背景,因为使用双缓冲技术时是直接复制整个缓冲区数据到显示缓冲区,因此无论原有缓冲区里面有什么都会被覆盖,因此第三个参数设置成 FALSE 有 助于提高新能。更主要的原因是,如果先擦除原有缓冲区,会导致中间有一瞬间显示缓冲区被清空(显示为默认背景色),然后等到复制了双缓冲区的数据后再显示新的图像,这将导致闪烁! 这与使用双缓冲的本意相违背,所以要注意这一点。

    四、双缓冲使用 (MFC 版本)

    void CGame2Dlg::OnPaint()
    {
         CPaintDC dc(this); // device context for painting
         CRect rect;
         GetClientRect(&rect);
         // 创建内存DC
         CDC memDC;
         memDC.CreateCompatibleDC(&dc);
         // 创建内存位图
         CBitmap bmp;
         bmp.CreateCompatibleBitmap(&memDC, rect.right - rect.left, rect.bottom - rect.top);
         // 将位图选入DC
         memDC.SelectObject(&bmp);
         // 绘图
         m_pGameEngine->Show(memDC.m_hDC);
         // 将后备缓冲区中的图形拷贝到前端缓冲区
         dc.BitBlt(0, 0, rect.right - rect.left, rect.bottom - rect.top, &memDC, 0, 0, SRCCOPY);
    }




    五、双缓冲使用 (C# 版本)

    public void Show(System.Windows.Forms.Control control)
    {
        Graphics gc = control.CreateGraphics();
        // 创建缓冲图形上下文 (类似 Win32 中的CreateCompatibleDC)
        BufferedGraphicsContext dc = new BufferedGraphicsContext(); 
        // 创建指定大小缓冲区 (类似 Win32 中的 CreateCompatibleBitmap)
        BufferedGraphics backBuffer = dc.Allocate(gc, new Rectangle(new Point(0, 0), control.Size));     
        gc = backBuffer.Graphics;             // 获取缓冲区画布        
        /* 像使用一般的 Graphics 一样绘图 */
        Pen pen = new Pen(Color.Gray);
        foreach (Step s in m_steps)
        {
            gc.DrawLine(pen, s.Start, s.End);
        }
        
        // 将双缓冲区中的图形渲染到指定画布上 (类似 Win32 中的)BitBlt
        backBuffer.Render(control.CreateGraphics());   
    }

    其他版本后续用到时再补充。


    参考资料:

    文中用到的 Win32 API 在MSDN中的说明:

    C# 中使用double buffer 

    展开全文
  • 双缓冲技术讲解

    万次阅读 2017-05-15 17:49:17
    双缓冲技术就是解决这个问题,但要了解如何,我们首先需要检查计算机如何显示图形。像计算机显示器一样的视频显示器一次绘制一个像素。 它从左到右扫过每行像素,然后向下移动到下一行。 当它到达右下角时,它会...
  • Linux framebuffer双缓冲防止闪烁

    千次阅读 多人点赞 2019-05-12 07:48:33
    利用双缓冲来解决问题。 意思就是说, 逐像素点画图这件耗时的操作,不要直接操作显存,而是操作一块预先分配好的和显存一样大小的缓冲区,等逐点画图完成之后,一次性将该缓冲区的内容memcpy到事先mmap好的显存...
  • DMA双缓冲传输意义

    千次阅读 2016-02-01 18:35:57
    双缓冲,也有人叫乒乓缓冲.因为一般情况下,串口的数据DMA 传输进BUF1 的过程中,是不建议对  BUF1 进行操作的.但由于串口数据是不会等待的直传,所以你总不能等BUF1 满了,  才往FLASH 上写,因为这时候串口数据...
  • JAVA中的双缓冲问题

    千次阅读 2008-03-28 21:56:00
    /** *//** *双缓冲 *什么是重量级,轻量级 *轻量级在这里指用纯java实现的。重量级指和其他语言混合编程,这样耗用的资源多系统触发的绘画操作 *绘画操作的分类 *系统触发的和程序触发的绘画操作 *AWT的绘制...
  • 双缓冲绘图技术: 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。 当数据量很大时,绘图可能...
  • GDI+学习笔记(四)Bitmap与双缓冲

    千次阅读 2014-05-31 10:47:29
    本文利用Bitmap实现双缓冲,与
  • C#绘图双缓冲

    千次阅读 2012-12-06 17:02:55
    C#绘图双缓冲   C#双缓冲解释: 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的...
  • Java双缓冲技术

    万次阅读 多人点赞 2012-10-28 10:38:52
    Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色。在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理。本文从J2SE的一个再现了屏幕闪烁的Java ...双缓冲是计算机动画处理中的传统技术,在
  • java的双缓冲技术

    千次阅读 2016-03-19 23:54:17
    Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色。在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理。本文从J2SE的一个再现了屏幕闪烁的Java ...双缓冲是计算机动画处理中的传统技术,在
  • DrawPanel双缓冲实现画板.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 双缓冲、多缓冲技术在计算机科学中其实是一个广义的概念,不过其本质上的意思都是差不多的。今天我们就来讲一讲双缓冲技术在android绘图中的应用。 何谓缓冲? 在理解双缓冲的原理之前,我们先要明白,什么叫...
  • QT_双缓冲技术1

    千次阅读 2013-03-05 13:51:55
    Rubber band(橡皮筋线,或者橡皮线), pixmap(图像,双缓冲中用到的图像,有时也直呼pixmap),off-screen pixmap(离线图像) Plot(plot,这一节实现的就是一个绘制曲线的控件Plotter,有时原文也叫plot,有点...
  • Java双缓冲技术详解

    千次阅读 2016-07-08 16:06:59
    Java双缓冲技术 返回 存档 删除 添加到收藏夹 分享 显示选项 Pocket 我的列表添加到收藏夹存档列表 文本视频图像标签 › Careers at PocketBecome a SponsorMore
  • c++三人/双人贪吃蛇源码,双缓冲,多线程,AI蛇,吃啥长啥 游戏介绍: 在游戏时间结束之前吃尽可能多的食物 尽可能的长(zhang)长(chang) 然后干掉其他的蛇! 只有 1 个幸存者! 作者の坦白: 我只做了游戏的...
  • 双缓冲的使用—java语言

    千次阅读 2016-03-29 16:50:20
    我们在update函数里只调用paint函数,而在paint函数里实现了双缓冲,两种方法原理一样,要灵活掌握,这里给出双缓冲的一般步骤: (1)定义一个Graphics对象ig和一个Image对象i。按屏幕大小建立一个缓冲对象给i。...
  • tid=86980 第45章 STM32H7的ADC应用之...本章教程为大家讲解定时器触发配合DMA双缓冲做ADC数据采集,实际项目中有一定的使用价值,一个缓冲接收数据的时候,另一个缓冲可以做数据处理。 45.1 初学者重要提示 45.2...
  • 单缓冲与双缓冲的区别

    万次阅读 2011-11-13 13:07:06
    OpenGL单缓冲与双缓冲的区别(追加10分) 最佳答案 单缓冲,实际上就是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你回到屏幕的...
  • java 双缓冲技术解决屏幕闪烁问题

    千次阅读 2018-06-15 10:33:40
    所谓双缓冲,就是在内存中重新开辟新空间,作为后台图像,然后把本来要在界面上进行的清理和重绘在后台处理好,生成一幅新的画面,最后再显示在界面上。  原理总是很简单的,实现起来时怎样呢?    首先要 定义两...
  • SurfaceView双缓冲测试

    千次阅读 2016-03-25 13:45:01
    安卓SurfaceView主要在工作线程中更新视图,使用双缓冲机制。 因为绘制到设备的时间远小于保存到内存的时间,所以把所有图元统一绘制到内存,然后再统一绘制到设备,能够优化显示速度。 找了一些SurfaceView的...
  • 双缓冲

    2010-11-16 10:05:00
    双缓冲意思就是先将图画在内存中,然后再一次拷贝显示到屏幕上,没啥神秘的 画图一般是在OnPaint中画:C/C++ code CPoint ptCenter; CRect rect,ellipseRect; GetClientRect(&rect); ptCenter ...
  • 嗯,这样就很简单了,直接把dwBackBufferCounting设置为2就行了,其他的操作跟双缓冲一样。   好了,这边的难度感觉确实要高点了,我看的有点慢,下一节还会讲第七章,是如何把图像拷贝到主界面中,按cocos里...
  • 做了一个简单的对话框,上面有一个picture控件,为了让picture控件上的内容在窗口最小化或者拖出窗口范围之后,仍然得以保存,并且防止闪烁,采用了双缓冲绘图的方式。 重载了OnPaint函数 。。。 //也可以不重绘...
  • 本文主题,用双缓冲办法解决闪烁,以下转载基本上能解决,源代码可参考软件"飞鞋" ----------------------------------------------------------------------------------- 转载:...
  • (1)背景 (1.1)减少锁的冲突 在生产者-消费者模式中,我们常常会使用到队列,这个队列在多个线程共享访问时存在互斥和竞争操作, 意味...如果采用双缓冲区的话,一个缓冲区bufferA用于生产者执行put操作,一个缓...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,334
精华内容 14,933
关键字:

双缓冲什么意思