Java2D绘图是闪烁的

时间:2012-01-19 00:03:49

标签: java java-2d

我正在使用GameBoy模拟器并使用Java2D进行绘图。但是我目前的绘图方法在我的Linux机器上引起了很多闪烁。这个闪烁在我朋友的Mac上不存在。

我应该先解释一下GameBoy上的图形。 GameBoy不维护要绘制的像素数据数组,而是具有渲染的精灵和平铺数据列表。内存中还有一个字节,其中包含正在渲染的垂直线的当前x坐标。

因为我需要监视正在绘制的内容的当前x位置,我认为绘制所有内容的最佳方法是遍历所有tile和sprite,将它们呈现为BufferedImage,然后通过此BufferedImage和使用当前x坐标更新内存中的点时,逐个像素地绘制它。

这是我的代码:

@Override
public void paint(Graphics graphics) {
    super.paint(graphics);
    Graphics2D g = (Graphics2D) graphics;
    BufferedImage secondBuffer = new BufferedImage(160, 144, BufferedImage.TYPE_INT_RGB);
    Graphics2D bg = secondBuffer.createGraphics();

    display.draw(ram, buffer.createGraphics());
    for (int y = 0; y < 144; y++) {
        for (int x = 0; x < 160; x++) {
            bg.setPaint(new Color(buffer.getRGB(x, y)));
            bg.drawLine(x, y, x, y);
            ram.getMemory().put(Ram.LY, (byte) x);
        }
    }

    bg.dispose();
    g.drawImage(secondBuffer, null, 0, 0);

    cpu.setInterrupt(Cpu.VBLANK);
}

我不是Java2D的专家,因此可能会有一些我不熟悉的问题。我无法弄清楚为什么这是代码导致闪烁。

编辑:我使用OpenJDK可能有关也可能没有关系。我听说它有一些图形问题,但我不知道这是不是原因。

2 个答案:

答案 0 :(得分:1)

当我遇到摆动怪异的图形问题时,几乎总是因为我在操纵数据对象的同时,swing正试图渲染它们。解决此并发问题的最简单方法是使用SwingUtilities.invokeLater()。下面的示例代码将在swing线程内调用,而不是应用程序的主线程。

SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        CHANGE DATA STRUCTURES HERE
        }});

由于操作系统依赖的线程行为如何,这些问题在每台计算机上表现出不同。有关更多信息,请参阅:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

答案 1 :(得分:0)

我发现了这个问题。我犯了混淆AWT和Swing的愚蠢错误,因为我不做GUI或Java。我正在绘制Canvas,而不是Swing对象。当我切换到Swing对象(我的GUI的其余部分是Swing)时,闪烁消失了。