5

这个问题很奇怪并非每个平台都会出现此问题。它发生在我使用 MacOSX 的 Google Chrome 中,但它不会发生在 Safari 中。对于使用 Windows 的朋友来说,在 Google Chrome 上它可以完美运行。我还有一个使用 MacOSX 的朋友,对他来说,它在 Chrome、Safari 和 Firefox 上闪烁。我们都有 MacOSX Lion。我没有看到任何链接。你们能否测试它并报告它是否发生,以及您的平台是什么(最多应在 30 秒内发生)?


在 Oracle 的论坛上找到了这个帖子。显然,这是 MacOSX 上的一个众所周知的问题,因为 Java 创建了一个子进程,而 Safari 不允许将此作为​​安全功能。然而,这个问题也出现在 Mac 上的 Chrome 和 Firefox 中(对于我来说,Safari 上没有)。去想……我很高兴听到任何人对此的看法。


我目前正在制作一个小型 Java 俄罗斯方块游戏,我的问题是在小程序版本(扩展 JApplet)中屏幕偶尔会闪烁。当我在计算机上的 JFrame 中运行它时,一切正常。

这个小程序可以在这个网站上查看和使用:http: //mtetris.herokuapp.com/(我不是想做广告或宣传任何东西,我只是把它放出来,这样人们就可以真正看到问题所在)。

(还有另一个问题是,当小程序没有自动加载时,它不能正确获得鼠标焦点——即当浏览器阻止它并询问用户是否允许加载它时。如果“开始级别”数字没有正确突出显示,这就是原因。)

以下是我尝试过的未能解决闪烁问题的方法:

  • 将小程序的背景、根窗格、内容窗格、小程序中的每个组件设置为黑色。
  • 覆盖小程序的paint()方法并在其中进行双缓冲(我在当前代码中注释了这部分,因为它没有改进任何东西)
  • 覆盖小程序的update()方法,直接调用(现在根据官方文档中的方法描述paint()已经修复了这个问题)

整个源代码可以在这个页面的 github 上找到。扩展 JApplet 的类是 TetrisApplication。源代码还不是很干净,所以,很抱歉。


这就是我实现双缓冲的方式

public class TetrisApplication extends JApplet {

    //  the dimension of the applet
    private Dimension dimension;
    // image used for double buffering
    Image offscreen;
    // the second buffer
    Graphics bufferGraphics;

    public void init() {
        super.init();
        dimension = getSize();
        offscreen = createImage(dimension.width, dimension.height);
        bufferGraphics = offscreen.getGraphics();
        ...
    }

    public void paint(Graphics g){
        bufferGraphics.clearRect(0, 0, dimension.width, dimension.height);
        super.paint(bufferGraphics);
        g.drawImage(offscreen, 0, 0, this);
    }
    ...
}
4

3 回答 3

3

为了更平滑的绘制,覆盖的paintComponent()方法JPanel,默认情况下是双缓冲的。这个答案讨论了一个例子。

于 2012-04-26T02:50:14.543 回答
0

我注意到GameController您正在使用后台线程(在 a 中SwingWorker)来更新状态。我怀疑当更新发生paint()GamePanel.

更好的方法可能是将所有内容推送到 EDT,使用 ajava.swing.Timer触发每一帧并导致状态更新,然后使用repaint(). 然后就没有同步问题了。

于 2012-04-25T22:22:40.417 回答
0

要停止轻弹,您需要对绘图表面进行双重缓冲。您确定您第一次正确实施了吗?

也许这会有所帮助:https ://gamedev.stackexchange.com/questions/18661/how-do-i-prevent-flickering-when-drawing-to-a-jpanel

于 2012-04-25T22:11:56.367 回答