2012-01-19 165 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),閃爍消失了。