2013-11-25 166 views
1

我喜歡用雙緩衝創建一個小圖形庫以避免閃爍。畫布:雙緩衝

所以我創建了一個雙緩衝策略Canvas。我假設我strategy.getDrawGraphics()返回當前的後臺緩衝區(繪圖緩衝區)。比我在緩衝區上繪製一些東西。現在我假設strategy.show()用前臺緩衝區翻轉後臺緩衝區,以便後臺緩衝區顯示在屏幕上。但我不明白,當我運行下面的代碼一個黑色的矩形:

final JFrame frame = new JFrame(); 
frame.setSize(800, 600); 
frame.setVisible(true); 

final Canvas canvas = new Canvas(); 
frame.add(canvas); 

// Double Buffering 
canvas.createBufferStrategy(2); 
final BufferStrategy strategy = canvas.getBufferStrategy(); 

Graphics2D current = (Graphics2D) strategy.getDrawGraphics(); 
current.setColor(Color.BLACK); 
current.fillRect(0, 0, 800, 600); 
strategy.show(); // flip back buffer with front buffer? 
current.dispose(); 
Toolkit.getDefaultToolkit().sync(); 

Thread.sleep(1000); 
frame.dispose(); 

回答

2

三樣東西......

  1. 您應該避免混合重和輕重量組件(添加CanvasJFrame
  2. 您應該避免在Event Dispatching Thread的上下文中使用Thread.sleep長時間運行的循環或調用阻塞方法(如I/O)。這可能會阻止您的應用程序被繪製(等等)。相反,您應該考慮使用類似javax.swing.Timer的東西,它會睡在後臺線程中,但會在事件調度線程的上下文中觸發。默認情況下,Swing組件是雙緩衝區。

看一看......

詳情

+0

謝謝。這不是真正的答案,但我遵循你的提示。我已經用'JPanel'替換了'Canvas'。因爲我不知道哪些事件會調用'paintComponent',所以我使用2個'BufferedImages'並且隨時進行交換。這工作正常,沒有閃爍。我還將引擎的所有圖形方法放在'invokeAndWait'中,比如'drawCircle',所以我確定''BufferedImage'上的所有更改以及對'JPanel'的所有調用都是在UI Thread中執行的。這可能不是很出色,但是它沒有閃爍效果很好。那就是我需要的:) – Vertex