我是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..
}
}
我不知道..我已经研究了这个很长一段时间..而且根本没有运气..我不知道......也许它就在那里,而且它非常简单明了我看起来太傻了......
感谢所有帮助.. :))
答案 0 :(得分:21)
以下是它的工作原理:
JFrame
在您致电BufferStrategy
时构建createBufferStrategy(2);
。 BufferStrategy
知道它属于JFrame
的特定实例。您正在检索它并将其存储在bs
字段中。Graphics2D
检索bs
。此Graphics2D
对象与bs
拥有的内部缓冲区之一相关联。当你画画时,一切都进入那个缓冲区。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());
这可以防止丢失的缓冲帧,根据the docs,偶尔会发生这种情况。