1

作为任务的一部分,我正在重建“塞尔达传说与过去的联系”。

而且我遇到了以下问题,游戏世界是一个 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();
    }
}

谢谢你。

4

2 回答 2

4

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

于 2010-03-03T15:41:39.083 回答
0

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

作为额外的奖励,我不需要使用 JPanels。

于 2010-03-03T17:04:01.193 回答