`

[Java]双缓冲技术

    博客分类:
  • Java
阅读更多

我们很多用Java中的g.drawImage()方法导入图像时,如果我们将当前窗口转变成非当前窗口状态,再从非当前窗口恢复到当前窗口状态,有时,某些绘制好的图像会消失,除非我们重新刷新窗口,显示才会恢复正常。此外,当我们移动窗口或者其他的窗口在上移动的时候,图像会有些闪烁。这是怎么一回事呢?这就要涉及到Canvas中的paint方法的绘图机制了。产生这种现象的主要原因是:

1、由于在显示所绘制的图像时,调用了repaint方法。repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面。这样,在清除背景和绘制图像的短暂时间间隔内被用户看见的就是闪烁。

2、由于paint()方法需要进行复杂的计算,图像中包含着多个图形,不同图形的复杂程度及其所需要的绘制时间不同,因此,图像中的各个像素值不能同时产生,使得图形的生成频率低于显示器的刷新频率,从而造成闪烁。 

下面两种方法可以明显地消除或减弱闪烁: 

1、重载update方法 

AWT接收到Canvas重新绘制的请求时,调用Canvasupdate方法。默认情况下,update方法清除Canvas的背景,然后调用paint方法。重载update方法,就可以将以前在paint方法中的绘图代码包含在update方法中,从而避免每次重新绘制时将整个区域清除。

2、双缓冲技术

双缓冲技术在很多动画中被采用。主要原理是创建一幅BufferedImage图像,将每一帧画入图像,然后调用drawImage方法,将整个BufferedImage图像一次画到屏幕上去。这种方法的优点在于大部分绘制是在BufferedImage进行的。将BufferedImage绘制的图像一次绘制到屏幕上。首先通过调用new BufferedImage方法生成合适的缓冲区,然后获得在缓冲区的绘图环境(即Graphics类对象)。

综上所述,我们导入图像的思路是:不直接在paint方法中调用各种绘制方法,而是采用重载update方法及双缓冲技术,生成一个图像的缓冲区,获得该缓冲区中的绘图环境后,将该绘图环境读入内存。paint方法不再负责图像的绘制工作,即paint方法不再装入任何的图像绘制代码。我们在paint方法中,直接调用update方法,在内存缓冲区的绘图环境下进行图像的绘制工作,当所有的图像绘制工作完成后,最后将缓冲区的内容一次性地写入Canvas并在窗口中直接显示出来。这种方法很巧妙地解决了图像丢失和闪烁的问题。

例子代码如下:

package org.lyndon.test;

 

import java.awt.Canvas;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.BufferedImage;

 

import javax.swing.ImageIcon;

 

public class MyCanvas extends Canvas {

 

private static final long serialVersionUID = 1L;

 

// 窗体的宽与高

 

public static final int WIDTH = 480;

 

public static final int HEIGHT = 480;

 

private Image screen = createImage(WIDTHHEIGHTtrue);// 双缓冲

 

private Graphics graphics = screen.getGraphics();

 

private Image resultImage;

 

/**

 * 生成一个BufferImage

 * 生成一个BufferImage BufferImage是Image的子类,左上角坐标都为 (0, 0)

 * 第三个参数是代码Image图形类型,分为14种,以位数又分为1,2或4位

 * 

 * @param width

 * @param height

 * @param flag

 * @return

 */

final static public BufferedImage createImage(int width, int height,

boolean flag) {

if (flag) {

return new BufferedImage(width, height, 2);

else {

return new BufferedImage(width, height, 1);

}

}

 

public MyCanvas() {

// 设定初始构造时面板大小

setPreferredSize(new Dimension(WIDTHHEIGHT));

// 初始导入一张图片

ImageIcon icon = new ImageIcon("image/floor.gif");

resultImage = icon.getImage();

}

 

//

@Override

public void update(Graphics g) {

graphics.drawImage(resultImage, 0, 0, this);

g.drawImage(screen, 0, 0, null);// 最后个参数一定要用null,这样可以防止drawImage调用update方法

g.dispose();

}

 

public void paint(Graphics g) {

update(g);//我们在paint方法中,直接调用update方法

}

 

}

分享到:
评论
10 楼 李_俊 2012-03-23  
sky3380 写道
这是awt的双缓冲,如果用的是swing就不需要了,因为swing有自己的双缓冲机制

你从哪里听说的,亲自用过没?如果用过就举个例子,没有就不要老是引用这句话。
9 楼 lyndon.lin 2010-03-25  
刷新前捕捉操作
8 楼 iooyoo 2010-03-25  
lyndon.lin 写道
这样会造成什么情况呢?不是窗口刷新成后,如果这些操作影响窗口,又接着刷新窗口,应该也没有什么问题啊?

比如鼠标点击,捕捉这个事件的组件是刷新前的还是刷新后的?
7 楼 aoliwen521 2010-03-25  
说实话,每太看懂。awt没大做过。一会再看一遍。
6 楼 lyndon.lin 2010-03-25  
这样会造成什么情况呢?不是窗口刷新成后,如果这些操作影响窗口,又接着刷新窗口,应该也没有什么问题啊?
5 楼 iooyoo 2010-03-25  
就我能想到的举个例子: 通常我们在桌面应用中,如果窗口刷新缓慢,但是这时候用户有鼠标键盘操作,这些命令会在窗口刷新完成后被顺序执行
4 楼 lyndon.lin 2010-03-25  
还该如此改善,请楼上指点一下,谢谢。
3 楼 iooyoo 2010-03-25  
思路是这样没错,不过自己做这个双缓冲,呵呵,得考虑更多的交互
2 楼 lyndon.lin 2010-03-25  
因为本人不太用swing,都是使用awt。
1 楼 sky3380 2010-03-25  
这是awt的双缓冲,如果用的是swing就不需要了,因为swing有自己的双缓冲机制

相关推荐

    Java双缓冲技术.doc

    总结来说,Java双缓冲技术是解决屏幕闪烁问题的关键。通过在内存中创建一个额外的缓冲区,可以先在缓冲区中完成所有绘制,然后再一次性将缓冲区内容绘制到屏幕上,从而避免了频繁的屏幕刷新,显著提升了动画的视觉...

    Java双缓冲技术Java双缓冲技术

    Java双缓冲技术 Java双缓冲技术是计算机动画处理中的传统技术,广泛应用于Java游戏编程和多媒体动画处理中。该技术的主要作用是消除屏幕闪烁,以提高动画的流畅度和用户体验。 Java双缓冲技术的原理是将屏幕分为...

    Java双缓冲技术原理详细讲解例子

    Java双缓冲技术是一种提高图形界面性能的策略,尤其在绘制复杂的UI组件时,能有效避免闪烁现象,提供平滑的视觉体验。双缓冲的核心思想是将屏幕上的绘图操作先在一个临时缓冲区进行,待全部操作完成后再一次性将缓冲...

    Java双缓冲技术原理详细讲解例子Java实用源码整理learns

    Java双缓冲技术是一种图形渲染优化策略,主要用于提高GUI(图形用户界面)的性能和减少屏幕闪烁,提升用户体验。在Java中,它主要应用于Swing和JavaFX等图形库。本教程将深入探讨Java双缓冲技术的原理,并通过实例...

    java双缓冲技术————包含实例及技术详解,适合新手

    ### Java 双缓冲技术详解与实例 #### 一、引言 在Java图形用户界面(GUI)编程中,经常会遇到由于频繁更新屏幕显示而导致的视觉闪烁问题,这不仅影响用户体验,还会降低应用程序的整体质量。为了解决这一问题,...

    Java双缓冲技术[参考].pdf

    Java 双缓冲技术详解 Java 双缓uffer 技术是 Java 游戏编程和多媒体动画处理中的重要技术之一。它可以解决屏幕闪烁的问题,使得屏幕显示更加流畅。下面我们将详细介绍 Java 双缓存技术的原理和实现方法。 一、问题...

    Java双缓冲技术详细讲解

    ### Java双缓冲技术详解 #### 一、双缓冲技术简介 在Java图形界面编程中,双缓冲技术是一种常用的提高绘制效率的技术。它通过减少屏幕闪烁和提高绘制速度来提升用户体验。双缓冲技术的核心思想是在内存中创建一个...

    Java双缓冲技术.pdf

    在深入探讨Java双缓冲技术之前,首先需要对双缓冲技术有一个基本的理解。双缓冲技术是一种常见的图形渲染技术,用于减少或消除在屏幕上绘制图形时出现的闪烁现象,特别适用于需要频繁更新画面的应用程序,例如动画和...

    java双缓冲消除闪烁

    ### Java双缓冲消除闪烁 #### 一、问题的引入与分析 在进行Java游戏开发或者多媒体动画处理时,经常会遇到屏幕闪烁的问题。这种现象不仅影响视觉体验,还可能降低应用程序的专业性和用户满意度。屏幕闪烁主要发生...

    俄罗斯方块_带双缓冲绘图

    在计算机图形学中,双缓冲技术是一种优化图形绘制的方法,特别是在动态游戏或者实时渲染场景中,它可以显著减少图像闪烁,提高用户体验。本篇文章将深入探讨如何使用Java语言来实现一个带双缓冲绘图的俄罗斯方块游戏...

    java画图(双缓冲)

    总结一下,双缓冲技术在Java中的应用可以显著提升GUI程序的画图性能和用户体验,防止画面闪烁,提供流畅的动画效果。通过重写`paintComponent`方法和利用`Graphics2D`对象,开发者可以实现自定义的画图功能,创建出...

    JAVA双缓冲绘图源码

    这样,每次窗口需要重绘时,都会自动应用双缓冲技术。 此外,Java Swing提供了更好的绘图组件JComponent,它的 paintComponent 方法已经内置了双缓冲机制,所以如果你使用Swing,无需手动实现双缓冲,只需重写`...

    双缓冲技术教程加源码.rar

    双缓冲技术是计算机图形学中一种优化显示更新的技术,尤其在游戏开发和用户界面设计中广泛应用。它旨在解决屏幕闪烁和图像撕裂问题,提供更流畅的视觉体验。本教程结合源码,将深入讲解双缓冲的工作原理及其应用。 ...

    JAVA人物动画.rar_JAVA画人像_java人物动画_动漫人物java_双缓冲

    在这个名为"JAVA人物动画.rar"的压缩包中,我们重点探讨的是如何利用Java来实现生动的人物动画,特别是针对"java画人像"、"java人物动画"、"动漫人物java"和"双缓冲"这些标签所涉及的技术。 首先,让我们深入理解...

    利用双缓冲做的时钟程序

    标题中的“利用双缓冲做的时钟程序”是指在编程中使用了双缓冲技术来实现一个显示实时时间的程序。双缓冲是一种图形渲染...通过深入学习和理解这些文件,开发者可以更好地掌握Java图形界面编程以及双缓冲技术的使用。

    11 双缓冲技术.ppt

    在Java编程中,尤其是在开发图形用户界面(GUI)或游戏时,双缓冲技术尤其重要。 在Java中,图形绘制主要通过Java AWT(Abstract Window Toolkit)和Swing库来实现。这些库提供了丰富的API,支持文字处理、图形绘制...

    动态画面特效核心技术----双缓冲技术

    以最简单明了的代码结构来阐述双缓冲技术的核心本质,最巧妙的设计在于利用update将双缓冲部分与绘图功能部分相分离,代码虽短,却蕴含丰富的Java设计思想和设计模式,特供免费下载分享,供大家一起学习,共同进步,...

    俄罗斯方块1.0.1(双缓冲绘图)

    总结起来,1.0.1版俄罗斯方块通过双缓冲绘图技术实现了更流畅的游戏体验,展示了Java在游戏开发领域的应用潜力。同时,开放源码的做法为学习者提供了实践和学习的平台,有助于培养新一代的编程爱好者。无论是从游戏...

    双缓冲例子

    为了解决这个问题,双缓冲技术应运而生。 双缓冲的工作原理如下: 1. 创建两个缓冲区:一个前端缓冲区和一个后端缓冲区。前端缓冲区是屏幕实际显示的内容,而后端缓冲区则用于绘制新图像。 2. 当需要更新图像时,...

Global site tag (gtag.js) - Google Analytics