Java图像闪烁

时间:2012-05-04 03:08:39

标签: java swing timer paint double-buffering

我可以从谷歌搜索中看到这个问题被问到很多,但我发现没有一个解决方案是为我做的。你知道,我用Java制作一个带有图像的游戏,因为游戏通常都有这些东西。但整个表格不断闪烁,我无法阻止它。是的,我已经双重缓冲它并覆盖了update()方法,虽然这肯定有帮助,但闪烁仍然存在。我不知道我是否在做双重缓冲,或者我需要完全不同的东西。

起初我觉得它可能与clearRect()行有关,但在删除它之后,游戏仍然闪烁,但当然每次都没有清除。所以这根本没有帮助。在减慢定时器时,闪烁几乎完全消失,但我需要将其减慢到100ms,即便如此,我仍然会有一些闪烁。此外,这对游戏来说太慢了。我试过让一个计时器在一个10ms的计时器上完成所有工作,一个单独的计时器在100ms进行绘画,但它看起来只是看起来很蠢。虽然闪烁仍然是一个问题,但我可以将绘画计时器减慢到大约30毫秒并使其保持平滑。

每10-30毫秒必须有一种方法可以做到这一点而不会闪烁。是否有其他方法类似于双缓冲但在这种情况下更好,或者我可以使用的东西?提前感谢您的帮助。

public class main extends JApplet implements ActionListener {
    //This Declares The Variables
    Graphics2D buffer;
    Image offscreen;
    Timer timGame = new Timer(10, this);
    //other variables

    public void init(){
        //This Creates The Offscreen Buffer Zone
        offscreen = createImage(getSize().width, getSize().height);
        buffer = (Graphics2D)offscreen.getGraphics();
        //other initialization stuff irrelevant to drawing
    }

    public void actionPerformed(ActionEvent evt){
        if (evt.getSource() == timGame)
            runGame();
    }

    private void runGame(){
        //Do stuff, move objects
        repaint();
    }

    public void paint(Graphics g){
        super.paint(g);

        buffer.clearRect(0, 0, getSize().width, getSize().height);
        //draw stuff to buffer
        g.drawImage(offscreen, 0, 0, this);
    }

    public void update(Graphics gr){
        paint(gr);
    }

1 个答案:

答案 0 :(得分:9)

不要直接绘制顶级窗口的paint(...)方法,例如JApplet或JFrame,因为你失去了所有双缓冲和所有Swing好东西。而是绘制您添加到JApplet的JPanel或其他JComponent派生组件(包括JComponent本身)的paintComponent(...)方法。

如果您在此处或Google中搜索此主题,您会看到在此网站和其他网站上多次询问和回答,答案是相同的。

e.g。