最终效果:
现在分析一下,闪烁是什么造成的
观察渲染的几帧图片,发现其中有一帧是全黑的
第一帧:
第二帧:
第三帧:
为什么呢?因为渲染速度太慢了,以至于我们能够直接看到渲染的过程
每个窗口都有一个Graphics,我们暂且叫它“窗口画布”,直接画贴图在这上面比较费时间:
while(渲染未完成)
{
窗口画布.DrawImage() -> 操作系统 -> 显卡
}
在物体比较多时,上面的过程就会执行很多次,耗费的时间就更多
比较简单的一个解决方法是在内存中创建一个独立的画布,暂且叫它“内存画布”
那么渲染的过程就变成了这样:
while(渲染未完成)
{
内存画布.DrawImage() -> 内存
}
//将内存画布的内容一次性复制到窗口画布上
窗口画布.DrawIamge(内存画布.到Image()) -> 操作系统 -> 显卡
操作内存画布耗的时间比窗口画布要小得多,所以渲染速度大大加快
下面来引用到代码里
修改Game类的paint方法
//重写窗体绘制方法
@Override
public void paint(Graphics g)
{
//双缓冲
Image img = this.createImage(width, height);//在内存里创建一个和窗口长宽一样的图片(画布)
tempGraphics = img.getGraphics();//获得画布的Graphics
clear(tempGraphics);//将画布清除为背景色
//渲染所有的sprite
for(int i = 0; i < gameObjects.size(); i++)
{
gameObjects.get(i).onTick();
gameObjects.get(i).draw(tempGraphics);//在画布上画出每个物体
}
g.drawImage(img, 0, 0, null);//将内存画布的内容复制回窗口上
}
启动之后的效果: