double buffer(解决repaint闪烁的问题,Java).docx

double buffer(解决repaint闪烁的问题,Java).docx

ID:61512991

大小:16.46 KB

页数:7页

时间:2021-02-09

double buffer(解决repaint闪烁的问题,Java).docx_第1页
double buffer(解决repaint闪烁的问题,Java).docx_第2页
double buffer(解决repaint闪烁的问题,Java).docx_第3页
double buffer(解决repaint闪烁的问题,Java).docx_第4页
double buffer(解决repaint闪烁的问题,Java).docx_第5页
资源描述:

《double buffer(解决repaint闪烁的问题,Java).docx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、doublebuffer(解决repaint闪烁的问题,Java)2011-01-0223:04publicvoidupdate(Graphicsg){       if(offScreenImage==null){                offScreen=this.createImage(800,600);        }        GraphicsgraphicOffScreen=offScreenImage.getGraphics();         paint(graphicOffScreen);         g.d

2、rawImage(offScreenImage,0,0,null);}有关APIcreateImagepublicImagecreateImage(int width,int height)创建一幅用于双缓冲的、可在屏幕外绘制的图像。参数:width-指定的宽度height-指定的高度返回:一幅屏幕外可绘制的图像,可用于双缓冲。如果组件是不可显示的,则返回值可能为null。如果GraphicsEnvironment.isHeadless()返回true,则经常发生这种情况。从以下版本开始:JDK1.0另请参见: //还有就是paint()里面那个

3、Graphics是从offScreenImage中得到的那个Graphics;//下面这段引用,总结有几点1.Swing本身就有双缓冲,awt没有。2.只重画需要重画的部分能够,得到最高的效率。                              Java双缓冲技术Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色。在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理。本文从J2SE的一个再现了屏幕闪烁的JavaAppilication简单动画实例展开,对屏幕闪烁的原因进行了分析,找出了闪烁成因的关键:update(Gr

4、aphicsg)函数对于前端屏幕的清屏。由此引出消除闪烁的方法——双缓冲。双缓冲是计算机动画处理中的传统技术,在用其他语言编程时也可以实现。本文从实例出发,着重介绍了用双缓冲消除闪烁的原理以及双缓冲在Java中的两种常用实现方法(即在update(Graphicsg)中实现和在paint(Graphicsg)中实现),以期读者能对双缓冲在Java编程中的应用能有个较全面的认识。 关键词:Java 消除闪烁 双缓冲 一、问题的引入在编写Java多媒体动画程序或用Java编写游戏程序的时候,我们得到的动画往往存在严重的闪烁(或图片断裂)。这种闪烁虽然

5、不会给程序的效果造成太大的影响,但着实有违我们的设计初衷,也给程序的使用者造成了些许不便。闪烁到底是什么样的呢?下面的JavaApplication再现了这种屏幕闪烁的情况:  这种闪烁是如何出现的呢?首先我们分析一下这段代码。DoubleBuffer的对象建立后,显示窗口,程序首先自动调用重载后的paint(Graphicsg)函数,在窗口上绘制了一个小圆,绘图线程启动后,该线程每隔30ms修改一下小圆的位置,然后调用repaint()函数。注意,这个repaint()函数并不是我们重载的,而是从Frame类继承而来的。它先调用update(G

6、raphicsg)函数,update(Graphicsg)再调用paint(Graphicsg)函数[②]。问题就出在update(Graphicsg)函数,我们来看看这个函数的源代码:publicvoidupdate(Graphicsg){if(isShowing()){       if(!(peerinstanceofLightweightPeer)){           g.clearRect(0,0,width,height);       }       paint(g);   }}    以上代码的意思是:(如果该组件是轻量组件的

7、话)先用背景色覆盖整个组件,然后再调用paint(Graphicsg)函数,重新绘制小圆。这样,我们每次看到的都是一个在新的位置绘制的小圆,前面的小圆都被背景色覆盖掉了。这就像一帧一帧的画面匀速地切换,以此来实现动画的效果。    但是,正是这种先用背景色覆盖组件再重绘图像的方式导致了闪烁。在两次看到不同位置小圆的中间时刻,总是存在一个在短时间内被绘制出来的空白画面(颜色取背景色)。但即使时间很短,如果重绘的面积较大的话花去的时间也是比较可观的,这个时间甚至可以大到足以让闪烁严重到让人无法忍受的地步。    另外,用paint(Graphicsg

8、)函数在屏幕上直接绘图的时候,由于执行的语句比较多,程序不断地改变窗体中正在被绘制的图象,会造成绘制的缓慢,这也从一定程度上加剧了闪烁。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。