Java优化为游戏绘制背景图像

标签 java image jpanel paint

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

我遇到了以下问题,游戏世界是一个 BufferedImage,其中 subImage() 是玩家当前位置所需的部分。游戏可以运行,但使用了 80%/110% 的 CPU。个人资料显示罪魁祸首是图像的绘制。

所以我想我将背景放在与玩家、敌人等 JPanel 分开的 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();
    }
}

谢谢。

最佳答案

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

关于Java优化为游戏绘制背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2372487/

相关文章:

java - Google App Engine servlet 请求限制

python - 将图像中颜色的不同深浅转换为一种颜色

java - 按下 JButton 后多次生成 JPanel "blink"

image - 批处理 .png 到 .webp

image - 将图标与一堆随机 PNG 中的图片分开

Java 加载/进度条

java - 启动时 JTextField 未显示在 JPanel 中

java - 为什么在 JUnitParams 方法中设置字段变量后它们为 null?

java - 无法通过套接字连接到其他设备

java - 拥有动态属性,不易修改