Двойная буферизация 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(
).