【问题标题】:Java program double buffered but still flickering, half the timeJava程序双缓冲但仍然闪烁,一半时间
【发布时间】:2014-05-13 23:20:54
【问题描述】:

我正在学习在

找到的中级 Java 教程

https://www.youtube.com/watch?v=M2GoiOas2u8&list=PL54DB126285ED0420.

但我遇到了双缓冲闪烁的问题。

我的两个类中的相关代码如下

GamePanel.Java

private void gameRender()
{
    if (dbImage == null) // create the buffer
    {
        dbImage = createImage(GWIDTH, GHEIGHT);
    }
    if (dbImage == null)
    {
        System.err.println("dbImage is still null!");
        return;
    }
    else
    {
        dbg = dbImage.getGraphics();
    }

    // Clear the screen
    dbg.setColor(Color.WHITE);
    dbg.fillRect(0, 0, GWIDTH, GHEIGHT);

    // Draw Game elements
    draw(dbg);
}

// Draw all game content in this method
public void draw(Graphics g)
{
    world.draw(g);
}

private void paintScreen()
{
    Graphics g;
    try
    {
        g = this.getGraphics();
        if (dbImage != null && g != null)
        {
            g.drawImage(dbImage, 0,  0,  null);
        }
        Toolkit.getDefaultToolkit().sync(); //For some OS.
        g.dispose();
    }
    catch(Exception e)
    {
        System.err.println(e);
    }
}

世界.Java

    public void draw(Graphics g)
{
    for (int i = 0; i < arrayNumber; i++)
    {
        g.drawImage(blockImg[i], blocks[i].x, blocks[i].y, null);
    }
}

其中数组编号 = 1200。 该程序仅在地图向右或向下移动时才会出现闪烁问题(这意味着 blocks.x 和 blocks.y 会随着 i 的每个值而增加),而反之则不会。我尝试通过将每个 [i] 替换为 [arrayNumber - i] 并修改 for 循环的参数来从右下角向上绘制。这使得闪烁仅在向上和向左移动地图时发生。

所以我知道我应该以某种方式修改 world 类中的这个 run 方法以某种方式使用双缓冲,但我想知道由于 world 不扩展 JPanel,我将如何去做?

【问题讨论】:

  • 如果您使用 swing 和 paintComponent 方法,则不需要实现双缓冲(因为它会自动执行双缓冲)。这似乎有很多不好的做法。我在任何地方都看不到您的paintpaintComponent 方法——我猜GamePanel.java 扩展了某种面板,并且您通过获取它的图形对象来绘制它(非常糟糕的主意,imo)。
  • 我认为你的教程指向了错误和危险的方向

标签: java flicker buffering


【解决方案1】:

不要使用this.getGraphics();,这不是Swing 中的绘画方式。

Swing 使用被动绘画算法,这意味着您无法控制绘画过程。 Swing 将决定应该绘制什么以及何时绘制。

默认情况下,Swing 组件已经是双缓冲的。

你应该理解并接受它,而不是与之抗争。

首先覆盖 paintComponent 其中的 GamePanel 并在此处渲染您的游戏状态(不要忘记调用 super.paintComponent

请查看Performing Custom PaintingPainting in AWT and Swing,了解有关如何在 Swing 中实现绘画的更多详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2011-10-30
    • 2012-08-27
    • 2015-05-01
    • 1970-01-01
    • 2018-11-15
    • 2014-10-12
    • 2019-06-12
    相关资源
    最近更新 更多