Java2D绘图正在闪烁

Java2D绘图正在闪烁,java,java-2d,Java,Java 2d,我正在开发GameBoy模拟器,并使用Java2D进行绘图。然而,我当前的绘图方法在我的Linux机器上引起了很多闪烁。我朋友的Mac电脑上没有这种闪烁 我应该先解释一下游戏机上的图形。GameBoy不维护要绘制的像素数据数组,而是具有渲染的精灵和平铺数据列表。内存中还有一个字节,包含正在渲染的垂直线的当前x坐标 因为我需要监视正在绘制的对象的当前x位置,所以我认为绘制所有对象的最佳方法是循环所有的平铺和精灵,将它们渲染为BuffereImage,然后遍历该BuffereImage并逐像素绘制,

我正在开发GameBoy模拟器,并使用Java2D进行绘图。然而,我当前的绘图方法在我的Linux机器上引起了很多闪烁。我朋友的Mac电脑上没有这种闪烁

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

因为我需要监视正在绘制的对象的当前x位置,所以我认为绘制所有对象的最佳方法是循环所有的平铺和精灵,将它们渲染为BuffereImage,然后遍历该BuffereImage并逐像素绘制,同时使用当前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);
}
@覆盖
公共空间绘制(图形){
超级油漆(图形);
Graphics2D g=(Graphics2D)图形;
BuffereImage secondBuffer=新的BuffereImage(160144,BuffereImage.TYPE_INT_RGB);
Graphics2D bg=secondBuffer.createGraphics();
display.draw(ram、buffer.createGraphics());
对于(int y=0;y<144;y++){
对于(int x=0;x<160;x++){
bg.setPaint(新颜色(buffer.getRGB(x,y));
背景抽绳(x,y,x,y);
ram.getMemory().put(ram.LY,(字节)x);
}
}
bg.dispose();
g、 drawImage(secondBuffer,null,0,0);
设置中断(cpu.VBLANK);
}
我不是Java2D的专家,所以可能有一些我不熟悉的东西在幕后发生。我不明白为什么这是导致闪烁的代码


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

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

SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        CHANGE DATA STRUCTURES HERE
        }});
由于依赖于操作系统的线程行为如何,这些问题在每台计算机上表现得不同。有关更多信息,请参阅:


我发现了这个问题。我犯了一个愚蠢的错误,混合了AWT和Swing,因为我不太会做GUI或Java。我在画布上画画,不是在摇摆物体上。当我切换到Swing对象(我的GUI的其余部分是Swing)时,闪烁消失了