2021-02-07

这周在写游戏时,之前看到屏幕会闪,也没在意,感觉影响不大,但这周在窗体的背景上写字时发现,闪的字都看不清,才去查找原因,看到学长在里发的信息说游戏可能遇到的问题时,我看到这样一句话"双缓冲解决闪烁的问题怎么样做,为什么有时候会出错,需要重写什么方法",我意识到可能就是这个原因,就去百度。


1.为什么会出现双缓冲闪屏问题

public void run(){

while(true){

repaint();

try{

Thread, sleep( 100);

}catch (InterruptedException e){

e. printStackTrace();

}

注意,这个repiant()函数不是我们重载的,

而是从Frame继承来的,它先调用update(Graphics g)函数,update(Graphics g)再

调用paint(Graphics g)函数,问题出在

update(Graphics g)函数中,update先用背景色覆盖组件再绘图像的方式导数了闪烁

由于组件的重绘会先调用 update方法,后

由 update调用paint方法,由于 update的

默认情况下操作如下

1清屏

2设置前景色

3重绘

当清屏后我们制作过程当中,我们就捕

到了空白的图像,就出现了闪烁

2解决双缓冲闪屏问题

private Image offScreenImage=null;

public void update(Graphics g){

    if(offScreenImage==null){

        offScreenImage=this.createImage(Constant.Game_WIDTH,Constant.Game_HEIGHT);

    }

    Graphics gOff=OffScreenImage.getGraphics();

    paint(gOff);

    g.drawImage(offScreenImage,0,0,null);

}(1)定义一个GraphicsgOffScreen对象和一个 ImageoffScreen对象按屏幕大小建立一个缓冲对象给 offScreen然后取得 offScreenr的GraphicsgOffScreen赋给。此处可以把goffScreen理解为逻辑上的缓冲屏幕,而把offScreen理解为缓冲屏幕上的图象。(2)在gOffScreen(逻辑上的屏幕)上用paint(Graphics)函数绘制图象。(3)将后台图象offScreenr绘制到前台以上就是一次双缓冲的过程。注意,将这个过程联系起来的是 repaint函数。 paintGraphics)是一个系统调用语句,不能由程序员手工调用。只能通过 repaint函数调用

你可能感兴趣的:(2021-02-07)