今天在玩“天天酷跑”的时候,吃到吸铁石,突然注意到,它的金币虽然移动的很快,却不会出现“卡”的现象;而我之前用Unity3D做的一个小游戏在iPhone上显示的帧率是30,但是缺感觉卡,而在电脑上,帧率是100多,却不卡。当时没太想明白,觉得莫名其妙啊,30fps的游戏是不会卡的才对。这几天看了《Real-Time Rendering 3rd》中运动模糊的相关内容,再结合“天天酷跑”和“Doodle Jump”,大概理解这类游戏是如何提升视觉效果的。
播放电影的帧率一般是每秒24帧,我们觉得很流畅,即使电影中出现了很快移动的物体,比如一辆车飞驰而过,我们没有觉得怪异,因为每帧的图像是模糊的,模糊的程度和物体运动速度相关。然而,游戏中每帧画面却是清晰的,如果30fps的画面中,物体移动很快,这个时候看了就会觉得有卡顿的现象,因为缺少了运动模糊;若帧率提高到60fps或者更高,这个时候看着就会明显舒服很多,因为中间部分变得连贯了,模糊的部分由我们人眼完成了,类似于真实场景中有物体快速从眼前移动的情况。如果游戏中没有高速移动的物体,那么30fps和60fps看不出差距;若有高速移动的物体,根据《Real-Time Rendering 3rd》的描述,带运动模糊的30fps的效果和不带运动模糊的60fps的效果是差不多的。
在《Real-Time Rendering 3rd》中描述了几种主流的运动模糊的方法,其中“veolocity buffer”的方法是使用比较广泛的,书中也提到了对其改进的相关算法,改进后的效果还是比较不错的。这种方法在大型3D游戏中使用无可厚非,比如文中提到的“杀戮地带2”,但是如果只是“天天酷跑”或者“Doodle Jump”这类小游戏,需要用到这种技巧吗?还是说提高帧率就可以了?在大型3D游戏中,提高一倍帧率,开销会增大很多,所以需要采用运动模糊;但是在小游戏中,提高帧率不失为一个好办法。根据截图观察来看,“天天酷跑”和“Doodle Jump”的帧率一定不止30fps(可能是60fps),因为如果只是30fps,以这两个游戏的速度一定会出现卡顿现象,不信的童鞋可以拿Unity3D或者其他引擎做一个场景,让一个物体快速移动,速度可以选用“天天酷跑”里导弹的速度,30fpf时会觉得画面怪怪的,但是提高帧率后就正常了。
“天天酷跑”和“Doodle Jump”的游戏截图如下,因为“天天酷跑”吃到吸铁石以后我忙着截图,没注意跳,就挂了,所以只截了一个图;“Doodle Jump”在跳的不同速度的地方分别截图:
由截图可以看出,“天天酷跑”即使是在吃了磁铁道具可以吸金币的情况下,截图依旧是清晰的;“Doodle Jump”不论跳起到哪个阶段,截图都是清晰的。而在游戏中感觉这种快速移动是很流畅的,丝毫感受不到30fps时候的那种快速移动的卡顿,所以一定是采用了提高帧率的方案来提高视觉效果。(感谢5楼评论的“鎏”童鞋,cocos2d的默认帧率是60fps,我之前用的是unity3d,默认帧率是30fps,才会有了卡顿的问题。看来这些游戏应该不是经过了优化,而且引擎给他们设置了一个很合理的帧率)
有些看着很简单,一直认为是正确的东西,其实不一定是正确的,比如我之前就认为30fps的游戏不会卡,因为电影每秒24帧就不会卡。但是,很明显事实不是这样的,在自己做游戏的时候出现30fps还感觉卡的怪异现象,当时去网上搜了却没有解决,之后通过一系列学习才把问题解决了。这说明理论知识是很重要的,对分析问题很有帮助,如果不是学习了运动模糊,可能我一直都不知道问题到底出在哪里。另一方面,在自己没有动手做过的情况下,千万不要盲目的认为这很简单,因为很可能人家用了多种技巧,只是我不知道而已。所以,注重理论积累,多动手实践,遇到问题勤于思考,才能让自身水平不断提高。