以上原文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游戏开发或者多媒体动画处理时,经常会遇到屏幕闪烁的问题。这种现象不仅影响视觉体验,还可能降低应用程序的专业性和用户满意度。屏幕闪烁主要发生...
在计算机图形学中,双缓冲区技术是一种常用于优化图形绘制和更新,特别是对于动态图形显示,以消除或减少屏幕闪烁现象的策略。这个技术在游戏开发、GUI(图形用户界面)设计以及动画制作等领域中广泛应用。下面我们...
在计算机图形学中,双缓冲技术是一种优化图形绘制的方法,特别是在动态游戏或者实时渲染场景中,它可以显著减少图像闪烁,提高用户体验。本篇文章将深入探讨如何使用Java语言来实现一个带双缓冲绘图的俄罗斯方块游戏...
在计算机图形学和游戏开发领域,"双缓冲范例之水扁...通过使用双缓冲,我们可以确保动画的平滑过渡,消除闪烁,提供更优质的视觉体验。无论是简单的动画还是复杂的3D游戏,双缓冲都是保证图形渲染质量的关键技术之一。
- **消除闪烁**:双缓冲可以显著减少因为频繁的屏幕刷新而导致的闪烁现象,尤其是在动画或复杂图形操作中。 - **提高画面流畅性**:由于所有的绘制都在后台完成,然后再一次性显示,使得画面过渡更加平滑,提升了...
2. **防止图像撕裂**:在高帧率下,双缓冲可以防止图像在渲染未完成时被显示,从而消除视觉上的撕裂感。 3. **提高性能**:通过批量处理图形更新,双缓冲减少了屏幕重绘的次数,提高了整体性能。 在实际编程中,双...
**双缓冲技术**是一种广泛应用于图形渲染领域的技术,主要用于提高渲染效率和消除屏幕闪烁现象。在Java中,双缓冲技术主要应用于Swing和AWT组件的绘制过程中,尤其是当需要频繁更新显示内容时。 ##### 1. 单缓冲与...
接着,**双缓冲**是一种优化图形渲染的技术,用于消除在屏幕上绘制复杂图形时产生的闪烁现象。在单缓冲系统中,每次图形更新都会立即显示在屏幕上,这可能导致画面在刷新过程中出现闪烁。而双缓冲则是先在内存中的一...
双缓冲是一种消除图形更新时屏幕闪烁的技术。在Java中,开发者可以通过创建一个`BufferStrategy`来实现双缓冲。在这种情况下,所有的绘图操作首先在后台缓冲区完成,然后再一次性地显示到前台缓冲区,避免了频繁的...
为了消除闪烁,这里使用了双缓冲技术,先在离屏缓冲区(`offScreenImage`)上绘制,然后一次性将完成的图像绘制到屏幕,避免频繁的屏幕刷新导致的闪烁问题。 6. **异常处理** 在涉及到IO操作、线程交互等可能抛出...
这个技术的主要目的是消除或减少屏幕闪烁,提供更加平滑、流畅的动画效果。下面我们将深入探讨双缓存画图的工作原理、应用场景以及如何实现这一技术。 双缓存画图的核心理念是利用两个缓冲区:一个前台缓冲区和一个...
4. **图像显示**:客户端需使用图像显示功能来呈现鱼游动的动画,采用双缓冲技术消除闪烁。这可能使用了`javax.swing.JFrame`和`javax.swing.JPanel`创建窗口,`java.awt.Graphics`进行绘图,`java.awt.Toolkit`处理...
- **双缓冲**:为了减少闪烁,可以使用双缓冲技术,先在内存中完成图像的绘制,再一次性显示到屏幕上。 - **效率**:合理地管理资源,避免不必要的计算,优化游戏循环,确保游戏流畅运行。 这个项目是学习Java...
1. **双缓冲机制**:在游戏开发中,为了消除画面闪烁,提高用户体验,通常会采用双缓冲技术。它的工作原理是创建两个缓冲区,一个用于绘图,另一个用于显示。当一帧完成绘制后,再将绘制好的帧从后台缓冲区复制到...
10. **优化与性能**:为提高游戏性能,可以使用双缓冲技术避免闪烁,以及在可能的情况下使用异步处理。 以上就是实现Java版俄罗斯方块游戏的关键步骤。通过这个项目,你可以锻炼面向对象编程、图形界面设计、事件...
本文由黄颖琦所著,探讨了针对不同编程环境下的Java动画编程优化技术,包括如何消除动画闪烁、提高显示效果的技巧。 在Java动画编程中,常见问题包括手机动画死机、图像闪烁或残缺以及图像延迟。实现动画的基本原理...
同时,为了提高游戏性能,可以考虑使用双缓冲技术来避免屏幕闪烁。 在实际开发过程中,可能会遇到各种问题,如界面更新不及时、方块旋转后位置异常等。这些问题都需要通过调试和优化代码来解决。此外,还可以增加...