引言:
制作游戏对游戏的循环处理无疑是重要的,只有处理对游戏的循环,才不会出现游戏的卡顿现象。我们知道游戏中的动画是由一帧帧的静止的画面形成的,那么如果每一帧的画面因为机器处理的不同使得渲染时间不同,会使得游戏卡顿。一般的小游戏的FPS在60到100之间,FPS就是游戏画面的更新速率,代表每秒钟更新画面的次数,这里我们暂且取每一帧的更新时间为0.016秒,也就是FPS约为62。如果想要达到非常流畅的效果可以增大FPS,但切记最好不要使每一帧的时间小与其渲染时间(介绍完代码后就会理解是为什么了)。
游戏更新的主循环代码和注释如下:
class MainThread implements Runnable{
GameView Game=GameMainActivity.Game;//将游戏的主界面传入,GameView和GameMainActivity是自己定义的类
@Override
public void run() {
//这里是真正意义上的主循环,要记录时间
//真正意义上的开始时间,0点
//经过时间
long update=0;//用于记录游戏渲染的时间
long sleep=0;//用于记录游戏线程睡眠的时间
while(true){//如果想要很好的中断游戏线程,可以把true变为自己规定的boolean变量,通过改变变量值中断游戏
long before=System.nanoTime();//得到当前时间点,注意nanoTime()得到的是个时间点其数值并不是实际意义上的时间
long t=sleep+update;//用于记录上一帧花费的时间
Game.updateAndRender(t/1000f);//游戏界面的更新和渲染,该方法是自己在主界面中定义的
update=(System.nanoTime()-before)/1000000L;//这里是计算渲染的总共时间 sleep=Math.max(2,16-update);//因为我们规定了每一帧的睡眠时间是
16毫秒,所以在2和渲染后还剩余的时间中取个最大值作为睡眠时间,设2是为了防止渲染时间太长
try { Thread.sleep(sleep); } catch (InterruptedException e) { e.printStackTrace();
}
}
}
}
以上便是游戏界面更新的主循环线程,之前说的FPS不要非常大是因为如果机器的性能不好,或界面需要渲染的东西很多会导致渲染时间比较长,这样每一帧更新的时间就不能很好的控制,就会导致游戏的卡顿。
之所以像上面那样设置睡眠时间是为了保证在渲染时间在可控的范围内时,每一帧的更新时间一致这样游戏才会变的流畅。
希望对大家有帮助。如果有写的不好的地方望指出。