【问题标题】:Java Image FlickeringJava 图像闪烁
【发布时间】:2012-05-13 14:31:25
【问题描述】:

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

起初我以为可能与 clearRect() 行有关,但删除它后,游戏仍然闪烁,但当然不是每次都清除。所以这根本没有帮助。减慢计时器后,闪烁确实几乎完全消失了,但我需要将其减慢到 100 毫秒,即使那样我仍然会出现一些闪烁。此外,这对游戏来说太慢了。我尝试让一个计时器在 10 毫秒计时器上完成所有工作,另外一个计时器在 100 毫秒时进行绘画,但它看起来很跳跃。我可以将绘画计时器减慢到大约 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);
    }

【问题讨论】:

  • 您是否看到vsync tearing 试图更新屏幕太快? 60 Hz 的刷新率大约为每帧 17 毫秒...
  • 清除 super.paint() 行解决了这个问题。我知道这是愚蠢的事情。我想这就是我正常绘制它的结果,然后稍后再回来对它进行双重缓冲。我也会研究一下 PaintComponent,尽管我现在有点忙着看它。希望它也能有所帮助,尽管至少现在闪烁已经完全停止。我什至可以将计时器调回 10 毫秒 :) 非常感谢。

标签: java swing timer paint double-buffering


【解决方案1】:

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

如果您在此处或在 Google 中搜索此主题,您会发现该主题已在此网站和其他网站上被多次询问和回答,答案都是一样的。

例如

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 2012-12-01
    • 2013-01-09
    • 2012-08-22
    • 2015-04-25
    • 2010-10-29
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多