`

双缓冲技术

    博客分类:
  • 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方法

}

 

}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C#WinForm利用GDI+的双缓冲技术来提高绘图效率.pdf

    C# WinForm 利用 GDI+ 的双缓冲技术来提高绘图效率 在 .NET 时代,Windows 的绘图技术从 GDI 升级到了 GDI+,GDI+ 提供了一套统一的绘图编程模型,极大的提高了 Windows 绘图编程的方便性。然而,在实际开发中,...

    vc 双缓冲技术

    双缓冲技术在VC++编程中是一种优化图形更新和防止屏幕闪烁的重要策略。它主要用于GUI(图形用户界面)应用程序,尤其是在涉及到频繁的图形绘制和窗口重绘时。在没有双缓冲的情况下,每次图形更新都可能在屏幕上产生...

    双缓冲技术.rar

    双缓冲技术.rar 包含代码+文档+各种资料 我自己整理的 双缓冲技术.rar 包含代码+文档+各种资料 我自己整理的 双缓冲技术.rar 包含代码+文档+各种资料 我自己整理的 双缓冲技术.rar 包含代码+文档+各种资料 我自己...

    在Visual C++中适用双缓冲技术进行绘图

    ### 在Visual C++中应用双缓冲技术进行绘图 #### 双缓冲技术概述 双缓冲技术是一种用于提高图形用户界面(GUI)响应速度的技术,在视觉效果处理方面具有重要作用。尤其在Visual C++环境下,利用双缓冲可以显著减少...

    Java双缓冲技术.doc

    【Java 双缓冲技术】 Java 作为一种强大的开发语言,在游戏编程和多媒体动画处理领域具有显著的优势。然而,当涉及到动态图形显示时,一个常见的问题是屏幕闪烁。本文将深入探讨这个问题,以及如何通过双缓冲技术来...

    双缓冲技术原理以及优缺点

    ### 双缓冲技术原理以及优缺点 #### 一、双缓冲技术原理 双缓冲技术是一种在计算机图形学中广泛使用的渲染方法,它通过在后台(非显示)内存中完成图像的绘制工作,然后一次性将完整的图像复制到前台显示区域,...

    VC++ 双缓冲技术解决刷新闪烁的源代码实例

    VC++ 双缓冲技术解决刷新闪烁的源代码实例 VC++利用双缓冲技术解决刷新闪烁问题的源代码实例,经常从事VC编程的朋友可能知道,如果窗体的内容刷新次数过快,会导致屏幕或窗口闪烁问题,如何解决这个难题呢?那就看...

    双缓冲技术解决刷新闪烁_thenq78_Vc_

    在计算机图形学和软件开发中,特别是在Windows编程中,"双缓冲技术"是一个重要的概念,用于优化用户界面的更新和防止闪烁。这个技术主要应用于GUI(图形用户界面)应用程序,尤其是那些需要频繁更新画布或者窗口内容...

    基于VC的高效绘图 双缓冲技术

    ### 基于VC的高效绘图——双缓冲技术 #### 一、引言 随着计算机技术的发展,图形用户界面(GUI)已成为现代软件不可或缺的一部分。对于开发者而言,设计出美观且高效的图形界面至关重要。然而,在开发过程中,尤其...

    c# 双缓冲 技术与例子

    C#双缓冲技术是一种用于图形界面编程中减少或消除绘制过程中出现闪烁现象的技术。在处理图形绘制时,特别是在绘图区域频繁更新或绘制复杂图形时,绘制操作往往会导致用户界面出现闪烁。这种闪烁是由于在绘图过程中,...

    C#绘图双缓冲技术总结

    C#绘图双缓冲技术总结 双缓冲技术是C#绘图中的一种常用技术,用于解决绘图窗口闪烁问题。.NET Framework 1.1 和 .NET 2.0 中的双缓冲技术有所不同。在 .NET 1.1 中,使用 `this.SetStyle(ControlStyles....

    VC++双缓冲技术 实例解说双缓冲

    双缓冲技术是图形编程中的一种优化策略,尤其在VC++环境下,它被广泛应用于窗口系统中的动态绘图,以避免屏幕闪烁和不连续更新的问题。本文将深入探讨双缓冲技术的概念、工作原理以及在VC++中的实现方法。 双缓冲...

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

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

    GDI双缓冲技术应用说明及源代码

    双缓冲技术是GDI中一个重要的优化手段,主要解决在窗口重绘时出现的闪烁问题。本篇文章将深入探讨C#中如何利用GDI实现双缓冲技术,并通过源代码实例进行讲解。 双缓冲技术的核心思想是在内存中创建一个临时的缓冲区...

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

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

    listview 双缓冲技术

    双缓冲技术是解决这个问题的一种有效方法。 双缓冲技术,简单来说,就是为了解决在连续快速绘制时画面闪烁的问题。在ListView中应用双缓冲,主要是为了提高滚动时的流畅性。通常,我们会创建两个缓冲区:一个用于...

    双缓冲技术解决刷新闪烁

    双缓冲技术是计算机图形学和GUI编程中一种重要的优化手段,主要目的是解决界面元素在更新时出现的闪烁问题。在日常使用计算机时,比如浏览网页、玩图形化游戏或者观看视频,我们可能会注意到屏幕上的某些内容在快速...

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

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

    MFC绘图双缓冲技术

    为了解决这个问题,我们可以采用双缓冲技术。本文将深入探讨MFC绘图双缓冲技术的工作原理和实现方法。 双缓冲技术的基本思想是,在内存中创建一个与屏幕大小相同的位图,用于临时存储所有的绘图操作。当所有的绘图...

    在对话框上用双缓冲技术画图

    在这个特定的情境中,我们讨论的是如何在对话框上利用双缓冲技术进行图形绘制。 双缓冲技术是解决GUI(图形用户界面)程序中闪烁问题的一种有效方法。在没有使用双缓冲时,当我们在窗口或控件上直接画图时,由于...

Global site tag (gtag.js) - Google Analytics