今天在玩“天天酷跑”的時候,吃到吸鐵石,突然注意到,它的金幣雖然移動的很快,卻不會出現“卡”的現象;而我之前用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還感覺卡的怪異現象,當時去網上搜了卻沒有解決,之后通過一系列學習才把問題解決了。這說明理論知識是很重要的,對分析問題很有幫助,如果不是學習了運動模糊,可能我一直都不知道問題到底出在哪里。另一方面,在自己沒有動手做過的情況下,千萬不要盲目的認為這很簡單,因為很可能人家用了多種技巧,只是我不知道而已。所以,注重理論積累,多動手實踐,遇到問題勤於思考,才能讓自身水平不斷提高。