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
}

缺点是这种方法不能很好地与事件驱动渲染相结合。您通常必须选择其中之一。AlsogetBufferStrategy仅在 Swing 组件中实现,CanvasWindow使其与 Swing 组件不兼容。

可以在此处此处此处找到教程。

于 2011-05-08T00:04:02.763 回答
2

不要延长JPanel。扩展JComponent. 它几乎是相同的并且具有更少的干扰代码。此外,您paintComponent只会在其中执行绘图代码。如果您需要手动刷新组件,您可以使用component.redraw()。

于 2011-05-07T23:43:46.260 回答