2012-01-19 14 views
3

私はGameBoyエミュレータとJava2Dを描画に使用しています。しかし、私の現在の描画方法は、私のLinuxマシン上で多くのちらつきを引き起こしています。このちらつきは私の友人のMacにはない。Java2D描画が点滅しています

ゲームボーイのグラフィックを最初に説明する必要があります。 GameBoyは、描画されるピクセルデータの配列を維持するのではなく、レンダリングされるスプライトおよびタイルデータのリストを保持します。また、レンダリングされている垂直線の現在のx座標を含む1バイトのメモリがあります。

描画対象の現在のx位置を監視する必要があるため、すべてを描画する最良の方法は、すべてのタイルとスプライトをループしてBufferedImageにレンダリングしてから、このBufferedImageメモリ内のスポットを現在のx座標で更新しながらピクセル単位でプロットします。私は2Dで持つ専門家ではないよ

@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); 
} 

、私は精通していないですボンネットの下で起こって何かがあるかもしれません:

は、ここに私のコードです。なぜこのコードがちらつきを引き起こしているのか分かりません。

編集:私はOpenJDKを使用しているかどうかは関係ありません。グラフィカルな問題があると聞いていますが、それが原因かどうかはわかりません。

答えて

1

スイングで奇妙なグラフィックスの問題が発生すると、スイングがレンダリングしようとすると同時にデータオブジェクトを操作しているため、ほとんどの場合、データオブジェクトが操作されているためです。この並行性の問題を回避する最も簡単な方法は、SwingUtilities.invokeLater()を使用することです。以下のサンプルコードは、アプリケーションのメインスレッドではなく、スイングスレッド内で呼び出されます。

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

OSに依存するスレッドの動作によって、これらの問題は各コンピュータごとに異なることがあります。詳細については、以下を参照してください。私は問題を発見した

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

0

。私はGUIやJavaをあまり使わないので、AWTとSwingを混在させるという愚かな間違いをしました。私はSwingオブジェクトではなくCanvasで描画していました。 Swingオブジェクトに切り替えると(私のGUIの残りはSwingです)、ちらつきがなくなりました。

関連する問題