`
wiesin
  • 浏览: 2026 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

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方法在图像的缓冲区上作画。当所有的图像绘制工作完成后,最后将缓冲区的内容一次性的写入画板并在窗口中直接显示出来。由于update方法本身会清除背景,而重写后要自己代码清除背景,否则会在原图像未被清除的情况下继续作画,形不成动画。

例子代码如下:

 

Image offScreenImage=null;
    public void update(Graphics g) {              //双缓冲技术
    if(offScreenImage==null){
     offScreenImage=this.createImage(GAME_WIDTH,GAME_HEIGHT);  }
     Graphics goffScreen=offScreenImage.getGraphics();
     Color c=goffScreen.getColor();
     goffScreen.setColor(Color.GREEN);
     goffScreen.fillRect(0, 0, GAME_WIDTH,GAME_HEIGHT);
     goffScreen.setColor(c);
     paint(goffScreen);
     g.drawImage(offScreenImage, 0, 0,null);
  
 }

 

当然此方法并不适应所有情况,对于调用repaint方法的程序,调用流程如下:

repaint()方法
              |
              |
             V
      AWT线程--->paint()方法-->图形绘制
   |
   |
   V 


      update()方法--->paint()方法--图形绘制

 

 

 

 

repaint方法这样规定:如果绘制的轻量级组件,则update方法不会被调用,直接由AWT线程调用paint方法重新绘制。

此时如果采用重写update方法则不会产生任何影响。我们应该采用的是重写repaint方法实现双缓冲来消除闪烁。

 

 

 

附:

 

 

轻量级组件 是用JAVA代码画出来的,这样具有平台移植性

重量级组件 是调用操作系统的函数画出来的组件,比如主窗体

      一般来说尽量用轻量级的组件,这样对程序的移植性很好,一般javax.swing包里的组件大部分是轻量级的java.awt里面的是重量级的。

       Swing是由100%Java实现的,Swing组件是用Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此SwingAWT组件具有更强的实用性。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. 创建两个缓冲区:一个前端缓冲区和一个后端缓冲区。前端缓冲区是屏幕实际显示的内容,而后端缓冲区则用于绘制新图像。 2. 当需要更新图像时,...

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

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

Global site tag (gtag.js) - Google Analytics