为什么我的图纸不会没有循环显示?

时间:2014-08-16 07:58:13

标签: java image canvas buffer render

我正在试验缓冲区,我尝试用绿色填充缓冲区,然后立即在屏幕上显示,但屏幕不会显示绿色而没有循环。有人可以向我解释一下吗?

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
    }
}
}

1 个答案:

答案 0 :(得分:1)

当循环小于16时,屏幕上出现绿色,但它消失的速度很快,我们无法理解。循环循环执行将近1 ms。这对我们的大脑来说是快速的。 16个循环意味着将近16毫秒,这是我们可以捕获的最低速度。这就是为什么当它执行16次时你看到绿屏的原因。事实上,屏幕改变了16次,但由于屏幕的速度相互叠加,我们将其视为单个屏幕。尝试将Thread t置于休眠状态一段时间以获得更好的视图。