Java图像闪烁

Dou*_*oug 2 java swing timer paint double-buffering

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

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

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

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);
    }
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 9

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

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

例如