Java2D绘图闪烁问题

3
我正在开发GameBoy模拟器,并使用Java2D进行绘图。但是我的当前绘图方法在Linux机器上引起了很多闪烁问题。这种闪烁在我朋友的Mac上不存在。
首先,我应该解释一下GameBoy上的图形。GameBoy没有维护要绘制的像素数据数组,而是有一个渲染的sprite和tile数据列表。还有一个在内存中的字节,包含正在被渲染的垂直线的当前x坐标。
因为我需要监视正在绘制的当前x位置,所以我认为最好的绘图方法是遍历所有tile和sprite,将它们渲染到BufferedImage中,然后通过更新内存中的当前x坐标来逐像素地绘制这个BufferedImage。
以下是我的代码:
@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个回答

1
当我在swing中遇到奇怪的图形问题时,几乎总是因为我正在同时操作数据对象,而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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接