Двойная буферизация Java - PullRequest
4 голосов
/ 08 мая 2011

Я работаю над проектом и прочитал как можно больше о двойной буферизации в 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.Теперь, если вы видите мои комментарии, это моя главная проблема.Есть ли способ получить графику один раз вместо того, чтобы проходить через repaint и paintComponent, а затем назначать переменную каждый перерисовывать?Кроме того, это оборудование ускоряется по умолчанию?Если нет, что я должен сделать, чтобы аппаратно ускорился?

Ответы [ 2 ]

8 голосов
/ 08 мая 2011

Если вы хотите больше контроля над обновлением окна и использовать аппаратное перелистывание страниц (если доступно), вы можете использовать класс BufferStrategy.

Ваш *Затем метод 1006 * будет выглядеть примерно так:

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

    // draw stuff here

    bs.show(); // swap buffers
}

Недостатком является то, что этот подход плохо сочетается с рендерингом, управляемым событиями.Как правило, вы должны выбрать один или другой.Также getBufferStrategy реализован только в Canvas и Window, что делает его несовместимым с компонентами Swing.

Учебники можно найти здесь , здесь и здесь .

2 голосов
/ 08 мая 2011

Не расширять JPanel. Продлить JComponent. Это практически то же самое и имеет меньше мешающего кода. Кроме того, вы можете сделать код для рисования только в paintComponent. Если вам нужно обновить компонент вручную, вы должны использовать component.redraw().

...