控制台双缓冲技术

简介

双缓冲技术主要使用在绘图方面,不过,借鉴双缓冲技术的原理,可以让你的控制台程序优势更加优秀的体验,例如你编写的控制台游戏,往往需要不停地刷新屏幕,这时候会造成非常严重的问题-----屏幕闪烁!这极大的降低了用户体验(虽然说没什么用户吧,但这并不妨碍我们追求完美嘛~),双缓冲就可以消除这种闪烁

控制台双缓冲技术原理:

背景知识:你所看到的黑色界面所显示的东西 都是在"屏幕缓冲区"中显示的,我们能看的这个缓冲区,叫做"当前(激活的)屏幕缓冲区",我们可以创建其他缓冲区,也可以对其进行操作,但是是不可见的.

原理介绍:

新建一个屏幕缓冲区(此时不可见)

在新建的屏幕缓冲区中写入想要一次显示的内容

把该缓冲区设置为当前缓冲区(可见)

---->为什么能解决闪屏问题?

解释:假设你在屏幕上打印一系列11111111111111111111111111111111111111111111111111111,如果你是采用循环printf("1")来实现的,那么实际情况是屏幕上先输出1然后11接着111,,以此类推,我们看到了写的过程,再这样的过程中我们就会感到闪烁了,如果这么多1是一下子显示出来的,就不会有闪烁,双缓冲吧写的过程放在不可见的屏幕缓冲区中,一次性展示出来,就解决了闪烁问题.

具体实现:

---------------------------------创建屏幕缓冲区--------------------------------------

  1. HANDLE hNewConsole = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ,
  2. 0,
  3. NULL,
  4. CONSOLE_TEXTMODE_BUFFER,
  5. NULL);

------------------------------------可选项:隐藏光标---------------------------------------

  1. CONSOLE_CURSOR_INFO cci = {1, 0};
  2. SetConsoleCursorInfo(hNewConsole, &cci);

---------------------------------写入你想要显示的东西---------------------------------------

WriteConsole(hNewConsole, "这里是字符串", strlen(p), NULL, NULL);

------------------------------------------激活--------------------------------------------------

  1. SetConsoleActiveScreenBuffer(hNewConsole);
时间: 2024-10-29 15:53:36

控制台双缓冲技术的相关文章

双缓冲技术讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 首先要搞清楚计算机运行原理,计算机载运行时是将将最大的任务分解成多个任务,然后一个接一个地执行. 一个典型的例子,每个游戏引擎必须解决的问题是渲染. 当游戏画出用户看到的世界时,比如

avalon与双缓冲技术

avalon与双缓冲技术 avalon1.5一个重要技术升级是引进异步渲染.异步渲染在游戏界有一个更专业的名字,叫双缓冲.游戏界要刷新界面与我们刷新浏览器视图,面临的问题是一致的.视图是由许多存在套嵌关系的方块组成,它们每一个的改动,都可能引起reflow(其父节点,其父父节点的大小重新计算),这是造成性能问题的关键. 双缓冲技术的主要原理是:当一个动画争先显示时,程序又在改变它,前面的画面还没显示完,程序又要求重新绘制,这样屏幕就会不停闪烁.为了避免闪烁,可以使用双缓冲技术,将要处理的图片都放

OpenGL中实现双缓冲技术

在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);.这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用双缓冲而非单缓冲. 2. 调用glutDisplayFunc(display)注册回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针. 3. 调用

c++双缓冲技术绘图避免闪烁

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图. 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度.双缓冲实现过程如下: 1.在内存中创建与画布一致的缓冲区 2.在缓冲区画图 3.将缓冲区位图拷贝到当前画布上 4.释放内存缓冲区 在图形图象处理编程过程中,双缓冲是一种基本的技术.我们知道,如果窗体在响应WM_PAINT消息的时候

Win32 GDI 非矩形区域剪裁,双缓冲技术

传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简

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

双缓冲技术主要用在绘图,动画效果上,其原理就是:将资源先加载到缓冲区,然后再将缓冲区整个加载到View上面去.双缓冲技术能够有效防止闪烁,提高显示质量. DrawView.java: package com.example.handdraw; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.C

【MFC】MFC绘图不闪烁——双缓冲技术

MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/[email protected]/blog/static/49846449201033093333394/] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层

控件的重绘和双缓冲技术

处理重绘和无效操作: 重新定制控件行为和外观 Void Invalidate(); void Invalidate ( Rectangle ); //使控件的特定区域无效并且向控件发送绘制的消息; void Update(); //使控件重绘其工作区内的无效区域; void Refresh(); //相当于 this.invalidate(true); this.Update(); 双缓冲技术: 当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用

双缓冲技术(Double Buffering)(1、简介和源代码部分)

这一节实在是有些长,翻译完后统计了一下,快到2w字了.考虑到阅读的方便和网络的速度,打算把这节分为5个部分,第一部分为双缓冲技术的一个 简介和所有的代码,如果能够看懂代码,不用看译文也就可以了.第二部分为Plotter控件的公有函数的实现,第三部分为Plotter的事件处理函数的 实现,第四部分为Plotter控件的私有函数实现,第五部分为辅助类PlotSettings的实现. 这里给出一些常用的中英文对照(不一定准确,我这样用的): Rubber band(橡皮筋线,或者橡皮线), pixma