5

私はプロジェクトに取り組んでおり、Java でのダブル バッファリングについてできる限り読んでいます。私がしたいのは、描画するダブルバッファリングされたサーフェスを含む JFrame にコンポーネントまたはパネルまたは何かを追加することです。可能であればハードウェア アクセラレーションを使用し、それ以外の場合は通常のソフトウェア レンダラーを使用します。私のコードはこれまでのところ次のようになります。

  public class JFrameGame extends Game {

    protected final JFrame frame;
    protected final GamePanel panel;
    protected Graphics2D g2;

    public class GamePanel extends JPanel {

        public GamePanel() {
            super(true);
        }

        @Override
        public void paintComponent(Graphics g) {
            g2 = (Graphics2D)g;
            g2.clearRect(0, 0, getWidth(), getHeight());
        }
    }

    public JFrameGame() {
        super();
        gameLoop = new FixedGameLoop();

        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new GamePanel();
        panel.setIgnoreRepaint(true);
        frame.add(panel);

        panel.setVisible(true);
        frame.setVisible(true);
    }

    @Override
    protected void Draw() {
        panel.repaint(); // aquire the graphics - can I acquire the graphics another way?
        super.Draw(); // draw components

        // draw stuff here

        // is the buffer automatically swapped?
    }


    @Override
    public void run() {
        super.run();
    }
}

抽象的なゲーム クラスと、Update と Draw を呼び出すゲーム ループを作成しました。さて、私のコメントを見ると、それが私の主な懸念事項です。再描画と paintComponent を実行してから、再描画のたびに変数を割り当てる代わりに、グラフィックを一度取得する方法はありますか? また、このハードウェアはデフォルトで高速化されていますか? そうでない場合、ハードウェアアクセラレーションを行うにはどうすればよいですか?

4

2 に答える 2

9

ウィンドウが更新されるタイミングをより詳細に制御し、ハードウェア ページ フリッピング (利用可能な場合) を利用する場合は、BufferStrategyクラスを使用できます。

メソッドDrawは次のようになります。

@Override
protected void Draw() {
    BufferStrategy bs = getBufferStrategy();
    Graphics g = bs.getDrawGraphics(); // acquire the graphics

    // draw stuff here

    bs.show(); // swap buffers
}

欠点は、このアプローチがイベント ドリブン レンダリングとうまく組み合わせられないことです。通常、どちらかを選択する必要があります。また、Swing コンポーネントでgetBufferStrategyのみ実装されCanvasWindowSwing コンポーネントとの互換性がなくなります。

チュートリアルは、ここここ、およびここにあります。

于 2011-05-08T00:04:02.763 に答える
2

延長しないでくださいJPanel。延長しJComponentます。これは実質的に同じであり、干渉するコードが少なくなります。また、描画コードpaintComponentのみを実行します。コンポーネントを手動で更新する必要がある場合は、を使用しますcomponent.redraw()。

于 2011-05-07T23:43:46.260 に答える