Java优化绘画游戏的背景图像

时间:2010-03-03 15:24:59

标签: java image jpanel paint

作为作业的一部分,我正在努力重新创作“塞尔达传说与过去的联系”。

我遇到了以下问题,游戏世界是一个BufferedImage,其中我将subImage()作为播放器当前位置所需的部分。该游戏有效但占用了80%/ 110%的CPU。一份资料显示,罪魁祸首是图像的绘制。

所以我想我把背景放在一个单独的JPanel中,来自Player,敌人等JPanel。 将它们放在彼此顶部(JLayeredPane)并重新绘制背景面板的频率要低得多。

但是我该如何做到这一点如何告诉swing将一个面板绘制一次x次,另一次是y次?如果您有更好的优化方式,请告诉我。

这就是我现在所拥有的:

public class Main extends JFrame
{
    private ZeldaGame game = new ZeldaGame();
    private View view = new View(game);
    private BackgroundView bckView = new BackgroundView(game);
    private Controller ctl = new Controller(game, view, bckView, this);

    public Main()
    {
        setLayout(null);

        view.setBounds(0, 0, game.getWidth(), game.getHeight());
        bckView.setBounds(0, 0, game.getWidth(), game.getHeight());

        JLayeredPane pane = new JLayeredPane();
        pane.add(bckView, 1);
        pane.add(view, 0);

        setLayeredPane(pane);

        setSize(game.getWidth(), game.getHeight());
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);
    }

    public static void main(String[] args)
    {
        new Main();
    }
}

谢谢。

2 个答案:

答案 0 :(得分:4)

由于帧缓冲的工作方式,实际上不可能有不同的渲染时间 - 结果会是令人讨厌的闪烁。您需要做的是使用Canvas而不是JPanelJLayeredPane,您可以覆盖画布的paint()方法或使用bi.getGraphics()并使用blit背景和循环中的字符以正确的顺序使用这些方法之一。我建议使用像GTGE这样的瘦引擎,它将从优化的所有杂乱细节中抽象出来。您认真使用的这些高级组件并非专为游戏设计,您根本不应该使用它们。

答案 1 :(得分:0)

好的,我发现了我的方式错误。我使用被动渲染,而我应该使用active rendering。主动渲染基本上通过调用setIgnoreRepaint(true)来关闭自动重绘;在框架上,自己做循环。

另外,我不需要使用JPanels。