了解BufferStrategy

我是java的新手。 我想做一个游戏。 经过大量的研究,我无法理解bufferstrategy如何工作..我知道基础知识..它创建了一个屏幕外的图像,你可以在以后放入你的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.. } } 

我不知道..我已经研究了很长时间了……而且根本没有运气……我不知道……也许它就在那里,而且它非常简单明了,我我看起来太傻了..

感谢所有的帮助.. 🙂

以下是它的工作原理:

  1. 当你调用createBufferStrategy(2);时, JFrame构造一个BufferStrategy createBufferStrategy(2);BufferStrategy知道它属于JFrame特定实例。 您正在检索它并将其存储在bs字段中。
  2. 当你需要绘制你的东西时,你正在从bs中检索Graphics2D 。 此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()); 

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