`
huzhenyu
  • 浏览: 191904 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

AWT双缓冲,消除闪烁

    博客分类:
  • JAVA
阅读更多
以上原文from:http://blog.csdn.net/weizhaozhe/archive/2009/03/03/3951521.aspx
/**
 *双缓冲
 *什么是重量级,轻量级
 *轻量级在这里指用纯java实现的。重量级指和其他语言混合编程,这样耗用的资源多系统触发的绘画操作
 *绘画操作的分类
 *系统触发的和程序触发的绘画操作
 *AWT的绘制与界面更新使用了一个单独的线程,称为AWT线程。这个线程可以在两种情形下更新显示。
 *一种情况是界面“显露”,这可能会发生在界面首次显示时,或者界面某一部分由于被其它窗口遮盖后重新显示时。界面显露的处理是AWT自动进行的,。
 *第二种情况是程序在显示内容有所改变时进行界面的更新,而这一般是由应用程序的逻辑来控制的。
 *
 *repaint() update()paint()
 * 当我们应用程序的逻辑要对系统界面进行更新时,调用repaint() 方法来通知AWT线程进行刷新操作。repaint() 方法实际会让AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其paint()方法完成实际绘制工作。
 *第一个优化工作就是重写update() 方法,也就是不对当前区域进行清除工作,而直接进行绘制.
 *paint(g) 中的g代表屏幕对象,直接对代表屏幕对象的Graphics对象进行操作,而这个操作是比较费时的操作。解决的办法是采用“双缓冲”,即我们创建一个绘制缓冲区,以bufImage表示,先将主要的图形元素一个一个地绘制到此缓冲图像上,再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即 paint() 方法传入的“g”上。
 *
 *paint(g);直接对代表屏幕对象的Graphics 对象进行操作,而这个操作是比较费时的操作。
 *重写update()步骤:
 *得到缓冲图象this.offScreenImage = this.createImage(800,600);
 *看APIcreateImage用来创建一幅用于双缓冲的、可在屏幕外绘制的图像。
 *得到缓冲图象的画笔Graphics offg = this.offScreenImage.getGraphics();
 *绘制缓冲图象offg.setColor(Color.GREEN);
 *调用paint(),将缓冲图象的画笔传入
 *再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g”  上. g.drawImage(offScreenImage, 0, 0, null);
    *双缓冲问题只在AWT中存在,swing中已内置解决方案
 */
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TankClient extends Frame ...{

    private static final long serialVersionUID = 1L;
    private int X = 50, Y = 50;
    private int GAME_WIDTH = 800;
    private int GAME_HEIGHT = 600;
    private Image offScreenImage;

    public static void main(String[] args) ...{
        TankClient tc = new TankClient();
        tc.launchFrame();
    }

    @Override
    public void update(Graphics g) ...{
        //1.得到缓冲图像
        if(this.offScreenImage == null) ...{
            this.offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
        }
        //2.得到缓冲图像的画笔
        Graphics gOffScreen = this.offScreenImage.getGraphics();
        //3.绘制缓冲图像
        Color c = gOffScreen.getColor();
        gOffScreen.setColor(Color.GREEN);
        gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
        gOffScreen.setColor(c);
        //4.调用paint(),将缓冲图象的画笔传入
        paint(gOffScreen);
        //5.再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g”上
        g.drawImage(offScreenImage, 0, 0, null);
    }

    @Override
    public void paint(Graphics g) ...{
        Color c = g.getColor();
        g.setColor(Color.RED);
        g.fillOval(X, Y, 30, 30);
        g.setColor(c);
        Y += 5;
    }

    public void launchFrame() ...{
        this.setBounds(100, 100, GAME_WIDTH, GAME_HEIGHT);
        this.setBackground(Color.GREEN);
        this.addWindowListener(new WindowAdapter() ...{
            public void windowClosing(WindowEvent e) ...{
                setVisible(false);
                System.exit(0);
            }
        });
        this.setTitle("TankWar");
        this.setResizable(false);
        this.setVisible(true);
        new Thread(new PaintThread()).start();
    }

    class PaintThread implements Runnable ...{

        public void run() ...{
            while (true) ...{
                repaint();
                try ...{
                    Thread.sleep(50);
                } catch (InterruptedException e) ...{
                    e.printStackTrace();
                }
            }
        }

    }
}
分享到:
评论

相关推荐

    java双缓冲消除闪烁

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

    双缓冲区绘制线条,避免绘图闪烁

    在计算机图形学中,双缓冲区技术是一种常用于优化图形绘制和更新,特别是对于动态图形显示,以消除或减少屏幕闪烁现象的策略。这个技术在游戏开发、GUI(图形用户界面)设计以及动画制作等领域中广泛应用。下面我们...

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

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

    双缓冲范例之水扁跳舞

    在计算机图形学和游戏开发领域,"双缓冲范例之水扁...通过使用双缓冲,我们可以确保动画的平滑过渡,消除闪烁,提供更优质的视觉体验。无论是简单的动画还是复杂的3D游戏,双缓冲都是保证图形渲染质量的关键技术之一。

    使用双缓冲绘画.rar .

    - **消除闪烁**:双缓冲可以显著减少因为频繁的屏幕刷新而导致的闪烁现象,尤其是在动画或复杂图形操作中。 - **提高画面流畅性**:由于所有的绘制都在后台完成,然后再一次性显示,使得画面过渡更加平滑,提升了...

    商业编程-源码-实例解说双缓冲.zip

    2. **防止图像撕裂**:在高帧率下,双缓冲可以防止图像在渲染未完成时被显示,从而消除视觉上的撕裂感。 3. **提高性能**:通过批量处理图形更新,双缓冲减少了屏幕重绘的次数,提高了整体性能。 在实际编程中,双...

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

    **双缓冲技术**是一种广泛应用于图形渲染领域的技术,主要用于提高渲染效率和消除屏幕闪烁现象。在Java中,双缓冲技术主要应用于Swing和AWT组件的绘制过程中,尤其是当需要频繁更新显示内容时。 ##### 1. 单缓冲与...

    矩形框响应鼠标的拖拽(一)

    接着,**双缓冲**是一种优化图形渲染的技术,用于消除在屏幕上绘制复杂图形时产生的闪烁现象。在单缓冲系统中,每次图形更新都会立即显示在屏幕上,这可能导致画面在刷新过程中出现闪烁。而双缓冲则是先在内存中的一...

    java图形时钟基于自带多媒体编程

    双缓冲是一种消除图形更新时屏幕闪烁的技术。在Java中,开发者可以通过创建一个`BufferStrategy`来实现双缓冲。在这种情况下,所有的绘图操作首先在后台缓冲区完成,然后再一次性地显示到前台缓冲区,避免了频繁的...

    java课程设计报告---红绿灯控制道路车辆.docx

    为了消除闪烁,这里使用了双缓冲技术,先在离屏缓冲区(`offScreenImage`)上绘制,然后一次性将完成的图像绘制到屏幕,避免频繁的屏幕刷新导致的闪烁问题。 6. **异常处理** 在涉及到IO操作、线程交互等可能抛出...

    双缓存画图

    这个技术的主要目的是消除或减少屏幕闪烁,提供更加平滑、流畅的动画效果。下面我们将深入探讨双缓存画图的工作原理、应用场景以及如何实现这一技术。 双缓存画图的核心理念是利用两个缓冲区:一个前台缓冲区和一个...

    网络游鱼 Java课程设计实验报告 源代码

    4. **图像显示**:客户端需使用图像显示功能来呈现鱼游动的动画,采用双缓冲技术消除闪烁。这可能使用了`javax.swing.JFrame`和`javax.swing.JPanel`创建窗口,`java.awt.Graphics`进行绘图,`java.awt.Toolkit`处理...

    java写的俄罗斯方块游戏(applet)

    - **双缓冲**:为了减少闪烁,可以使用双缓冲技术,先在内存中完成图像的绘制,再一次性显示到屏幕上。 - **效率**:合理地管理资源,避免不必要的计算,优化游戏循环,确保游戏流畅运行。 这个项目是学习Java...

    java实现俄罗斯方块源码

    1. **双缓冲机制**:在游戏开发中,为了消除画面闪烁,提高用户体验,通常会采用双缓冲技术。它的工作原理是创建两个缓冲区,一个用于绘图,另一个用于显示。当一帧完成绘制后,再将绘制好的帧从后台缓冲区复制到...

    俄罗斯方块的Java代码简单实现

    10. **优化与性能**:为提高游戏性能,可以使用双缓冲技术避免闪烁,以及在可能的情况下使用异步处理。 以上就是实现Java版俄罗斯方块游戏的关键步骤。通过这个项目,你可以锻炼面向对象编程、图形界面设计、事件...

    Java动画编程优化技术.pdf

    本文由黄颖琦所著,探讨了针对不同编程环境下的Java动画编程优化技术,包括如何消除动画闪烁、提高显示效果的技巧。 在Java动画编程中,常见问题包括手机动画死机、图像闪烁或残缺以及图像延迟。实现动画的基本原理...

    基于j2se的俄罗斯方块

    同时,为了提高游戏性能,可以考虑使用双缓冲技术来避免屏幕闪烁。 在实际开发过程中,可能会遇到各种问题,如界面更新不及时、方块旋转后位置异常等。这些问题都需要通过调试和优化代码来解决。此外,还可以增加...

Global site tag (gtag.js) - Google Analytics