2011-05-07 168 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