13

我对java有点陌生。我想做一个游戏。经过大量研究,我无法理解缓冲策略的工作原理。我知道基础知识。它会创建一个离屏图像,您以后可以将其放入 Windows 对象中。我明白了

public class Marco extends JFrame {
    private static final long serialVersionUID = 1L;
    BufferStrategy bs; //create an strategy for multi-buffering.

    public Marco() {
       basicFunctions(); //just the clasics setSize,setVisible,etc
       createBufferStrategy(2);//jframe extends windows so i can call this method 
       bs = this.getBufferStrategy();//returns the buffer strategy used by this component
    }

   @Override
   public void paint(Graphics g){
      g.drawString("My game",20,40);//some string that I don't know why it does not show
      //guess is 'couse g2 overwrittes all the frame..
      Graphics2D g2=null;//create a child object of Graphics
      try{
         g2 = (Graphics2D) bs.getDrawGraphics();//this new object g2,will get the
         //buffer of this jframe?
         drawWhatEver(g2);//whatever I draw in this method will show in jframe,
         //but why??
      }finally{
         g2.dispose();//clean memory,but how? it cleans the buffer after
         //being copied to the jframe?? when did I copy to the jframe??
      }
      bs.show();//I never put anything on bs, so, why do I need to show its content??
      //I think it's a reference to g2, but when did I do this reference??
   }

   private void drawWhatEver(Graphics2D g2){
       g2.fillRect(20, 50, 20, 20);//now.. this I can show..
   }
  }

我不知道..我已经研究了很长时间了..而且一点运气都没有..我不知道..也许它就在那里,而且它真的很清楚很简单,而且我'我太傻了没看到。。

感谢所有的帮助.. :)

4

1 回答 1

27

以下是它的工作原理:

  1. 当您调用时JFrame构造 a 。知道它属于 的特定实例。您正在检索它并将其存储在该字段中。BufferStrategycreateBufferStrategy(2);BufferStrategyJFramebs
  2. 当需要绘制你的东西时,你正在检索一个Graphics2D来自bs. 此Graphics2D对象绑定到 拥有的内部缓冲区之一bs。当您绘制时,所有内容都会进入该缓冲区。
  3. 当你最终调用时bs.show()bs会导致你刚刚绘制的缓冲区成为当前的缓冲区JFrame。它知道如何做到这一点,因为(参见第 1 点)它知道JFrame它的用途。

这就是正在发生的一切。

通过对您的代码的评论......您应该稍微改变您的绘图程序。而不是这个:

try{
    g2 = (Graphics2D) bs.getDrawGraphics();
    drawWhatEver(g2);
} finally {
       g2.dispose();
}
bs.show();

你应该有一个这样的循环:

do {
    try{
        g2 = (Graphics2D) bs.getDrawGraphics();
        drawWhatEver(g2);
    } finally {
           g2.dispose();
    }
    bs.show();
} while (bs.contentsLost());

这将防止丢失缓冲区帧,根据文档,这种情况偶尔会发生。

于 2012-11-27T17:56:00.460 回答