java游戏循环精灵地图渲染

时间:2015-03-23 19:00:27

标签: java

我有一个扩展Canvas的类,这是我的构造函数:

public Game() {
        JFrame frame = new JFrame("Game");

        JPanel panel = (JPanel) frame.getContentPane();
        panel.setPreferredSize(new Dimension(1000, 600));
        panel.setLayout(new FlowLayout());

        setBounds(0, 0, 1000, 600);
        setIgnoreRepaint(true);

        frame.add(this);


        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        setFocusable(true);
        addKeyListener(this);

        try {
            img = ImageIO.read(getClass().getClassLoader().getResource("img.png"));
        } catch (IOException e) {
            System.out.println(e);
        }

    }

这是循环

try {
    this.repaint();
    Thread.sleep(17);
} catch (InterruptedException e) {
    e.printStackTrace();
}

和绘画方法

super.paint(g);
for (int i = 0; i < map.length; i++) {
    for (int j = 0; j < map[0].length; j++) {
        Tile current = map[i][j];
        g.drawImage(img, i * 32, j * 32, this);
    }
}

它正常绘制,但是它每17毫秒更新一次,就像滞后一样。我可以看到它每次都清晰和吸引。如何修复这个“fps drop”或者它是什么?

1 个答案:

答案 0 :(得分:0)

如果您正在使用java.awt.Canvas,则应使用java.awt.image.BufferStrategy进行绘画,而不是覆盖paint

Canvas不是双缓冲的,但是使用Canvas的目的是获得BufferStrategy的访问权限,BufferedImage提供双缓冲功能,主动绘画控制和更接近访问硬件。

不应在每个绘制周期重新绘制整个贴图,而应将贴图贴图渲染为{{1}}并改为绘制图像