【Java 2D游戏开发】双缓冲绘图 / 解决闪烁问题

最终效果:
没有闪烁了


现在分析一下,闪烁是什么造成的
观察渲染的几帧图片,发现其中有一帧是全黑的

第一帧:帧1
第二帧:帧2
第三帧:
帧3

为什么呢?因为渲染速度太慢了,以至于我们能够直接看到渲染的过程
每个窗口都有一个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);//将内存画布的内容复制回窗口上
}

启动之后的效果:
没有闪烁了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值