1

課題の一環として、「ゼルダの伝説過去へのリンク」の再現に取り組んでいます。

そして、次の問題があります。ゲームの世界はBufferedImageであり、プレーヤーの現在の場所に必要な部分をsubImage()します。ゲームは動作しますが、CPUの80/110パーセントを使用します。プロファイルは、犯人が画像の描画であることを明らかにしました。

だから私は、プレイヤー、敵などのJPanelとは別のJPanelに背景を置くことにしました。それらを互いに重ねてレンダリングし(JLayeredPane)、背景パネルを再描画する頻度を大幅に減らします。

しかし、これを行うにはどうすればよいですか?1つのパネルを1秒間にx回、他のパネルをy回描画するようにswingに指示するにはどうすればよいですか?最適化のより良い方法があれば、私に知らせてください。

これが私が現時点で持っているものです:

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との代わりにをJPanel使用する必要があります。キャンバスJLayeredPaneのメソッドをオーバーライドするか、これらのメソッドのいずれかを正しい順序で使用して、ループ上の背景と文字を使用してブリットすることができます。最適化のすべての厄介な詳細から抽象化するGTGEのような薄いエンジンを使用することをお勧めします。真剣に使用しているこれらの高レベルのコンポーネントはゲーム用に設計されていないため、まったく使用しないでください。paint()bi.getGraphics()

于 2010-03-03T15:41:39.083 に答える
0

わかりました、私は私のやり方の誤りを見つけました。アクティブレンダリングを使用する必要があったのに、パッシブレンダリングを使用していました。アクティブレンダリングは基本的に、setIgnoreRepaint(true);を呼び出すことによって自動再描画をシャットダウンします。フレーム上でループを自分で行います。

また、追加のボーナスとして、JPanelsを使用する必要はありません。

于 2010-03-03T17:04:01.193 に答える