在說正題之前,先說說動畫翅敌。
細說起來羞福,我接觸動畫挺早的。初中那會蚯涮,在上天的眷顧之下治专,我擁有了一個愛畫黃色漫畫的同桌,也正是在他的引領下恋昼,我接觸到了動畫看靠。他常用鉛筆在課本右下角勾一些線條,通常都是兩個小人變身互放龜波氣功的場景液肌,等每頁都畫上了挟炬,用手一撩撥,噼里啪啦地就放出了一段精彩的動畫嗦哆。
多年以后谤祖,他到一家游戲公司做美術設計,而我也終于知道老速,這就是傳說中的逐幀動畫粥喜。
怎么理解逐幀動畫呢?
想象一下你把一個西瓜往天上扔橘券,同時讓遠處的小伙伴給它來個瘋狂十連拍额湘。一陣卡擦過后,你就得到了十張照片旁舰。一旦這些照片以足夠的速度在你眼前逐張閃過锋华,我們就會看到一個西瓜做拋體運動(東西被往天上甩時所作的運動)的動畫。
我們把這些照片里的每一張叫做一幀箭窜;而這些照片閃過的速度毯焕,則是用幀率來衡量,我們說一個動畫幀率為24 FPS磺樱,就是說它一秒鐘會播放24幀纳猫。
那么婆咸,游戲跟動畫有什么區(qū)別?
我們以半塊磚工作室開發(fā)的風靡全球的游戲——《水果忍者》為例芜辕,來說明一下這個問題尚骄。
當你在iPhone上玩這款游戲的時候,你的iPhone會以每秒幾十幀的速度在屏幕上畫西瓜物遇,由于每幀里西瓜的位置不同——剛開始西瓜被畫在屏幕左下角乖仇,過一會它被畫在屏幕上部憾儒,最后又被畫在右下角——你最后就看到了一個正在做拋體運動的西瓜询兴。
那么,一個顯而易見的問題來了:這些幀又不是十連拍拍下來的起趾,它們是怎么畫出來的诗舰?或者說,這西瓜怎么就知道自己要做拋體運動训裆?它怎么就不飛出屏幕去或者飛一半自己爆掉呢眶根?
答案是你的iPhone在兩幀之間的空隙處做了很多工作,這些工作決定了這個西瓜的行為边琉,我們把這些工作叫做計算属百。
假設第一幀的時候西瓜位于左下角,iPhone把這一幀畫完后变姨,就得開始思考下一幀它得畫在哪這個問題族扰。回顧一下你曾經(jīng)學過的經(jīng)典物理課程:如果我們知道一個東西此刻的位置定欧、速度和加速度渔呵,就可以計算出若干時間(例如一幀)后它所處的新位置。你的iPhone正是根據(jù)西瓜第一幀的物理參數(shù)砍鸠,來計算它下一幀的位置扩氢,一旦算出來了,它才開始畫下一幀爷辱。
當然录豺,計算這件事實際上是由程序員們寫的代碼來實現(xiàn)的。不同的游戲需要計算不同的東西饭弓,比如《反恐精英》需要計算彈道軌跡双饥、《極品飛車》需要計算賽道摩擦、《瘟疫公司》需要計算病毒擴散示启。他們都有自己的一套代碼兢哭。
諸如位置、速度這一大坨參數(shù)夫嗓,在游戲開發(fā)里我們管它們叫做狀態(tài)迟螺。某一幀的狀態(tài)決定了這一幀的畫面冲秽。所謂的計算,實際上就是一個狀態(tài)到另一個狀態(tài)的變化矩父,而整個游戲的運行锉桑,則是狀態(tài)不斷變化,畫面也跟著不斷變化的過程窍株。
這種狀態(tài)不斷變化的東西叫做狀態(tài)機民轴。游戲在本質(zhì)上就是一個狀態(tài)機。
游戲跟動畫之間最大的區(qū)別也正在于此球订。對于動畫來說后裸,它只要把每一幀的畫面依次顯示出來就可以了,但游戲需要在兩個幀之間進行計算冒滩,在計算出新的狀態(tài)后微驶,才能渲染。
ok开睡,現(xiàn)在我們知道游戲世界里那個西瓜是怎么知道自己要做拋體運動的因苹,但還有個無聊的問題:剛才在真實世界里被你拋到天上的那個能吃的西瓜,又是怎么知道自己要做拋體運動呢篇恒?它怎么不飛出地球或者飛一半自己爆掉呢扶檐?
這個問題似乎還沒有答案。有一些物理學家和哲學家認為這個世界的一切事物本質(zhì)上都是信息胁艰,而整個宇宙則是一次不斷計算著的游戲款筑。類似的想法在藝術領域催生了很多有名的作品,比如大家熟悉的《黑客帝國》和《盜夢空間》蝗茁。事實上醋虏,我們的宇宙的確有一個最小的時間單位,叫做普朗克時間哮翘,約為5.39e?44秒颈嚼。這么看來,如果宇宙真是一款游戲饭寺,這幀率還挺高阻课,應該不卡——不過誰知道呢。
跟其它藝術形式相比艰匙,游戲在構(gòu)建虛擬世界這事上有得天獨厚的優(yōu)勢限煞。因為它們在本質(zhì)上是一個狀態(tài)機,所以這個虛擬世界可以有自己的規(guī)則员凝,就好像真實的世界有各種科學定律一樣署驻,而更出彩的是,這個虛擬世界不是封閉的,它可以接受來自外界的信息——當你的手指在屏幕上劃過時旺上,那個西瓜就會啪地爆開瓶蚂。這是我們在下篇文章里要說的用戶事件,敬請期待宣吱。