自己在编程过程中发现了一些小问题,在刷新屏幕时,无论将刷新频率调的快还是慢,都会出现屏幕闪烁的问题。查阅资料后发现可以用双缓冲技术解决。
双缓冲技术的原理
先在内存中分配一个和我们动画窗口一样大的空间(缓冲区),然后利用getGraphics()方法去获得双缓冲画笔,接着利用双缓冲画笔在缓冲区中绘制我们想要的东西,最后将缓冲区一次性的绘制到窗体中显示出来,这样在我门的动画窗口上面显示出来的图像就非常流畅了。
- 值得一提的是在swing包中已经直接提供了双缓冲的功能,我们只需要重写组件的paintComponent()方法就可以使用,然而awt当中并没有提供。
- 双缓冲技术的使用意味着内存的牺牲,不过在现在内存的使用并非游戏开发师需要首先考虑的问题
public void update(Graphics g)//双缓冲解决闪烁问题
{
if(offScreenImage == null)
{
offScreenImage = this.createImage(Const.FRAMEWIDTH,Const.FRAMEHEIGHT);
}
Graphics gOff =this.createImage(Const.FRAMEWIDTH,Const.FRAMEWIDTH).getGraphics();
paint(gOff);
g.drawImage(offScreenImage, 0, 0, null);
}
再附上paint函数的代码部分
public void paint(Graphics g) //绘制界面
{
g.drawImage(BG, 0, 0, null);
theBoss.drawSelf(g);
thePlane.drawSelf(g);
if(index%10 == 0)
weapon[index/10].setPosition(thePlane.posX+23, thePlane.posY-23);
for(int i =0 ;i<10;i++)
{
weapon[i].drawSelf(g);
}
if(index>=90) {index=0;}
index++;
}