2011-05-07 125 views
4

我正在开发一个项目,我已经阅读了尽可能多的关于java的双缓冲。我想要做的是添加一个组件或面板或东西到我的JFrame包含双缓冲表面绘制。如果可能,我想使用硬件加速,否则使用常规软件渲染器。我的代码看起来像这样到目前为止:Java双缓冲

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,然后分配每个重绘变量?此外,该硬件是否默认加速?如果不是,我应该怎么做才能使硬件加速?

+0

相关:http://stackoverflow.com/questions/2067255/bufferstrategy-vs-diy-double-buffering-in-jframe – finnw 2011-05-08 00:12:58

回答

8

如果您希望更好地控制窗口更新时间并利用硬件翻页(如果可用),则可以使用BufferStrategy类。然后

Draw方法会是这个样子:

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

    // draw stuff here 

    bs.show(); // swap buffers 
} 

缺点是,这种方法并不能与事件驱动渲染拌匀。你通常必须选择一个或另一个。另外getBufferStrategy仅在CanvasWindow中实现,使其与Swing组件不兼容。

教程可以找到here,herehere

+0

谢谢!这个和其他一些东西帮我弄明白了 – 2011-05-08 00:56:12

2

请勿延伸JPanel。扩展JComponent。它几乎是相同的,并且具有较少的干扰代码。另外,您只需在paintComponent中执行绘图代码。如果你需要手动刷新组件,你会使用component.redraw()。

+3

默认情况下,在Swing中启用双缓冲。见:http://java.sun.com/products/jfc/tsc/articles/painting/index.html#db – camickr 2011-05-08 00:46:07

+0

@camickr所以你会建议使用默认的游戏?并且,例如,使用标签来绘制通常会自己呈现的对象的图像。因此,而不是改变你绘制图像的位置,你会改变标签的位置?你有关于这种方法的文章吗? – Boro 2011-05-08 17:03:12

+0

@Boro,我真的不推荐任何与我上面的评论。我只是指出,你不需要在Swing中明确地打开双缓冲。我不知道使用JLabel还是直接绘制图标会更好。从理论上直接绘制图标应该更高效,因为JLabel绘图代码首先必须检查是否有文本要绘制并在标签中设置图标的位置等。但是图形绘制代码或这些少量额外语句的真正瓶颈在标签的绘制代码? – camickr 2011-05-08 18:48:44