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