作为作业的一部分,我正在努力重新创作“塞尔达传说与过去的联系”。
我遇到了以下问题,游戏世界是一个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();
}
}
谢谢。
答案 0 :(得分:4)
由于帧缓冲的工作方式,实际上不可能有不同的渲染时间 - 结果会是令人讨厌的闪烁。您需要做的是使用Canvas
而不是JPanel
和JLayeredPane
,您可以覆盖画布的paint()
方法或使用bi.getGraphics()
并使用blit背景和循环中的字符以正确的顺序使用这些方法之一。我建议使用像GTGE这样的瘦引擎,它将从优化的所有杂乱细节中抽象出来。您认真使用的这些高级组件并非专为游戏设计,您根本不应该使用它们。
答案 1 :(得分:0)
好的,我发现了我的方式错误。我使用被动渲染,而我应该使用active rendering。主动渲染基本上通过调用setIgnoreRepaint(true)来关闭自动重绘;在框架上,自己做循环。
另外,我不需要使用JPanels。