即使使用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