2012-01-19 84 views
3

我正在使用GameBoy模拟器并使用Java2D进行绘制。但是,我现在的绘图方法在我的Linux机器上造成了很多闪烁。我的朋友的Mac上不存在这种闪烁现象。Java2D绘图是闪烁

我应该首先在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。我听说它有一些图形问题,但我不知道这是否是原因。

回答

1

当我遇到奇怪的图形问题与摆动时,它几乎总是因为我操纵数据对象在同一时间摆动正试图呈现它们。解决此并发问题的最简单方法是使用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。我画的是一个画布,而不是一个Swing对象。当我切换到一个Swing对象时(我的GUI的其余部分是Swing),闪烁消失了。