一、产生双缓冲的原因
为什么我们要用到双缓冲呢?因为它能满足我们的需要。什么需要?这个对于经常做一些游戏动态画面的我们来说,是深有体会的。我们经常会发现动态的游戏画面会出现闪烁的现象。这不是我们希望看到的。为什么会有这种现象。据说,这是由于我们要做动态画面时,会用到重绘方法,即repaint()。而每次调用这个方法,就会调用里面的dataup()方法,这个就会刷新界面,即把原来的画面用一张白纸代替,再在这张白纸上画出程序正在运行的新的要执行的指令要求的图像画面。这样就会产生一个过程,即擦掉原来的图像,用白纸代替后又画上新的图像。而这个用白纸代替后画图形的过程,在我们的眼睛看来就是“闪烁”。所以为了解决这个问题,绘图的双缓冲方法就应运而生了。
二、双缓冲的原理以及使用方法
原理:根据上面讲到的闪烁的原因,解决问题的关键是不要让我们的眼睛看到那个用白纸代替后画图的过程。所以就有了这个方法:创建一个缓冲图片,在缓冲图片中画图,再把这个已经完全画好的缓冲图片画到界面上去。缓冲图片是我们看不见的,在它上面绘图是在计算机后台运作的。
使用方法:其实在原理中已经讲到了。这里就演示几行代码,其中的意思也就很明了了。
// 定义绘制方法
public void draw() {
// 创建一个图片缓存区
BufferedImage bImage = new BufferedImage(this.getWidth(),
this.getHeight(), BufferedImage.TYPE_INT_RGB);
// 获取缓存区画布
Graphics g = bImage.getGraphics();
// 设置画笔颜色
g.setColor(Color.GRAY);
// 将屏幕填充为画笔颜色
g.fillRect(0, 0, width, heigth);//width和heigth是我们在一个类中定义的int型变量,我们可以创建一个线程类,重写其中的run()方法,使得width和heigth的值每隔几十或几百毫秒变化一次,这个可以通过调整Thread.sleep(int time)方法中的time值来实现。用start()方法启动这个线程,这样当我们用一个对象来调用这个这个draw()方法时,就能够画出很多不同位置的矩形了。
// 获取窗体画布
Graphics gra = this.getGraphics();
// 将缓存区图片画到窗体上
gra.drawImage(bImage, 0, 0, null);
}
正像前面注释部分提到的一样,我们可以在一个类中实例化一个对象来调用这个draw()方法,这样就不会产生闪烁的动态图像了。
分享到:
相关推荐
MFC中如何实现双缓冲绘图,并且实现如何去除位图中的指定颜色,如去除图片底色等等。不懂请参看代码
【Qt】2D绘图之双缓冲绘图.rar
1、双缓冲绘图技术概述 原理:将一般的在CDC中绘图改成在一内存设备中绘图(CDC型变量,一般命名为pMemDC),然后使用BitBlt()函数将pMemDC中的图像复制到CDC中; 步骤: ①创建内存设备CDC *pMemDC;关联设备...
带双缓冲绘图,有效解决游戏过程中的图像闪烁问题
MFC 双缓冲绘图 圆球在屏幕中移动的动画,碰到边框反弹,解决了闪烁的问题
实现无闪烁、双缓冲绘图的具体方法 带上了实现的详细代码!!
双缓冲绘图 cscrollview 单文档
绘图 双缓冲技术 C#
C#WinForm利用GDI+的双缓冲技术来提高绘图效率.pdf
利用双缓冲技术实现的一个简单的绘图工具,可以选择线型、线宽、颜色等基本属性。
MFC利用双缓冲技术在IDC_STATIC上绘制图像
实例讲解双缓冲绘图,并附带滚动条的使用。
为防止高速刷新造成的屏幕闪烁问题,可以使用双缓冲技术。本文介绍了为使用双缓冲需要添加的代码,可以直接使用。
利用GDI+在Form中绘制60*60个圆点,显示帧速,使用三种不同方法,分别是: 1.直接绘制 2.使用双缓冲 3.使用BitBlt函数 对比三种函数的帧速,以及提速效果 开发环境为vs2008
1.0.1版本采用双缓冲绘图,比较1.0版本发现两者的差异,适合新手参考(未打包.jar在eclipse/myeclipse中新建工程导入即可)
本人收集的一些关于双缓冲绘图的教程,详细分析了造成屏幕闪烁的原因及其解决办法。
双缓冲绘制大图像,以及可复用的模板. 对比就能知道差异了
双缓冲绘图的关键代码,里面带有源码和说明
关于在VC++中适用双缓冲技术进行绘图的文章,适合于VC的初学之
双缓冲技术.rar 包含代码+文档+各种资料 我自己整理的 双缓冲技术.rar 包含代码+文档+各种资料 我自己整理的 双缓冲技术.rar 包含代码+文档+各种资料 我自己整理的 双缓冲技术.rar 包含代码+文档+各种资料 我自己...