我正在试验缓冲区,我尝试用绿色填充缓冲区,然后立即在屏幕上显示,但屏幕不会显示绿色而没有循环。有人可以向我解释一下吗?
public void draw() {
createBufferStrategy(2);
Graphics g = image.createGraphics();
BufferStrategy bs = getBufferStrategy();
for (int i = 0; i < 16; i++) {
System.out.println(i);
if (!a) {
g.setColor(Color.green);
g.fillRect(0, 0, w, h);
}
a = true;
Graphics bsg = bs.getDrawGraphics();
// bsg.drawImage(image, 0, 0, h, w, null);
// g.clearRect(0, 0, w, h);
// g.drawOval(0, 0, 50, 50);
bsg.setColor(Color.green);
bsg.fillRect(0, 0, getWidth(), getHeight());
bsg.dispose();
bs.show();
}
}
我还发现,如果我将循环设置为少于16次或取消它,则不会显示图像
这是一个完整的可运行代码
public class BufferTest extends Canvas implements Runnable {
int h = 400;
int w = 400;
BufferedImage image;
boolean a;
public static void main(String[] a) {
JFrame frame = new JFrame();
BufferTest test = new BufferTest();
frame.add(test);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
test.draw();
Thread t = new Thread(test);
// t.start();
}
public BufferTest() {
this.setPreferredSize(new Dimension(w, h));
image = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);
}
public void draw() {
createBufferStrategy(2);
// Graphics g = image.createGraphics();
BufferStrategy bs = getBufferStrategy();
for (int i = 0; i < 16; i++) {
System.out.println(i);
//if (!a) {
//g.setColor(Color.green);
//g.fillRect(0, 0, w, h);
//}
//a = true;
Graphics bsg = bs.getDrawGraphics();
//bsg.drawImage(image, 0, 0, h, w, null);
//g.clearRect(0, 0, w, h);
//g.drawOval(0, 0, 50, 50);
bsg.setColor(Color.green);
bsg.fillRect(0, 0, getWidth(), getHeight());
bsg.dispose();
bs.show();
}
}
@Override
public void run() {
while (true) {
draw();// TODO Auto-generated method stub
}
}
}
答案 0 :(得分:1)
当循环小于16时,屏幕上出现绿色,但它消失的速度很快,我们无法理解。循环循环执行将近1 ms。这对我们的大脑来说是快速的。 16个循环意味着将近16毫秒,这是我们可以捕获的最低速度。这就是为什么当它执行16次时你看到绿屏的原因。事实上,屏幕改变了16次,但由于屏幕的速度相互叠加,我们将其视为单个屏幕。尝试将Thread t置于休眠状态一段时间以获得更好的视图。