Двойная буферизация Java

Я работаю над проектом и прочитал как можно больше о двойной буферизации в 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 ответа

Решение

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

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

@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.

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

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

Другие вопросы по тегам