即使使用Java Swing一年以上,它仍然對我來說很神奇。如何正確使用BufferStrategy,特別是方法createBufferSrategy()
?什麼是使用createBufferStrategy()的正確方法?
我想有一個JFrame和一個畫布,它被添加到它,然後畫。我還希望能夠調整(setSize()
)Canvas。每次我調整畫布的大小時,似乎我的BufferStrategy
被丟棄或者變得沒有用處,因爲在BufferStrategy
上使用show()
實際上沒有做任何事情。此外,createBufferStrategy()
有一個奇怪的非確定性行爲,我不知道如何正確同步它。
這裏就是我的意思是:
public class MyFrame extends JFrame {
MyCanvas canvas;
int i = 0;
public MyFrame() {
setUndecorated(false);
setVisible(true);
setSize(1100, 800);
setLocation(100, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
canvas = new MyCanvas();
add(canvas);
canvas.makeBufferStrat();
}
@Override
public void repaint() {
super.repaint();
canvas.repaint();
//the bigger threshold's value, the more likely it is that the BufferStrategy works correctly
int threshold = 2;
if (i < threshold) {
i++;
canvas.makeBufferStrat();
}
}
}
MyCanvas
有一個方法makeBufferStrat()
和repaint()
:
public class MyCanvas extends Canvas {
BufferStrategy bufferStrat;
Graphics2D g;
public MyCanvas() {
setSize(800, 600);
setVisible(true);
}
public void makeBufferStrat() {
createBufferStrategy(2);
//I'm not even sure whether I need to dispose() those two.
if (g != null) {
g.dispose();
}
if (bufferStrat != null) {
bufferStrat.dispose();
}
bufferStrat = getBufferStrategy();
g = (Graphics2D) (bufferStrat.getDrawGraphics());
g.setColor(Color.BLUE);
}
@Override
public void repaint() {
g.fillRect(0, 0, 100, 100);
bufferStrat.show();
}
}
我只需撥打MyFrame
的從一段時間(true)循環repaint()
方法的主要方法。 當threshold
很小(即2)時,約有70%的案例中bufferStrat.show()
沒有做任何事情 - 在開始程序時JFrame保持灰色。其餘的30%它繪製矩形應該如何。如果我做threshold = 200;
,繪畫成功接近100%執行程序的時間。 Javadoc說createBufferStrategy()
可能需要一段時間,所以我認爲這是問題。但是,如何正確同步和使用它?顯然,我在這裏做錯了什麼。我無法想象這就是它應該如何使用。
有沒有人有一個最小的工作示例?
創建緩衝區看起來「沒問題」 「,有關更多詳細信息,請參見['BufferStrategy'](https://docs.oracle.com/javase/8/docs/api/java/awt/image/BufferStrategy.html),但它的用處不大。不要重寫'repaint',事實是,這是一個由Swing被動渲染引擎使用的機制,除了你沒有調用'super.repaint'這個事實,這可能會導致問題,使用' BufferStrategy'是爲了控制繪畫過程(或主動繪畫)。 – MadProgrammer
由於框架之間的競爭條件在屏幕上顯示並顯示在屏幕上,以及當您認爲有東西被塗漆以及未能調用'super.repaint'時,您遇到的許多問題 – MadProgrammer