Programming

[2010] 容易被遺忘的遊戲設計模組(1)


作者:NDark

時間:201001

“容易被遺忘的遊戲設計模組"之一: FPS counter

NTSC
NTSC

FPS是frame per second的意思。最早從電視電影的製作與撥放來的。
意思是每秒撥了幾個畫格。有在轉錄影片的朋友應該比較熟悉,
台灣電視訊號的標準就是NTSC他的FPS就是29.97。每秒換了幾乎30張影像。

格數(長度)相同的影片,如果撥快一點,
影片(時間)長度就會比較快撥完。人物就像快轉一樣。
(因為播放速度與原始影像拍攝的速度不同)

在我講下去之前,請務必思考上面這段說明與下面的問題。避免跟不上。

所謂 “撥快一點"到底是什麼變快了?

直接跳到遊戲。

要怎麼實現我的遊戲的撥放速度符合電視的標準?
很簡單,1/30秒畫一張就好了。畫完就送給電視。

所以最Naive(這裡必須說明Naive是直接簡單的意思,不一定等同於笨)的做法就是
用一個鬧鈴(timer,比較正確的講法是計時器)
每跳1/30就叫我的遊戲工人
把目前的牆壁刷成新的畫面,
然後請電視訊號線的長官來拍照驗收,送件。

上面的這個方法問題在哪裡?很明顯。

假如我有時候工人畫的快,有時候工人畫的慢,畫完的時候才驗收(傳送)
這樣電視顯示的結果也會忽快忽慢。
萬一電視收件的時間跟郵局一樣有限制,貨到的時候郵局已經下班,那這個畫格就掉了。
(這是白作工,明明就有畫,可是被之後的新貨物蓋掉了)

延伸思考

假如我某一個畫格突然運算量大增,此畫格畫了1秒才畫完。
意思是當工人在努力工作的時候,鬧鈴響了29次。這時候電視這頭會發生什麼情況?

另一種方法

大家其實都很清楚了,
我叫我的工人不停的工作,然後派一個工人拿著鬧鐘,
吩咐他:只要一聽到鬧鐘響馬上放下手邊工作去叫長官來。
管他這個畫格畫完沒。反正確保我有送件就好。
還沒畫完我還可以先拿上一個畫格的牆壁來墊一下檔。
甚至我在1/30秒內我工人畫了好幾次都不管,反正長官來有拍到最後的樣子。
(好像有點虐待勞工XD)

這問題事實上早已被解決,我為什麼要花了落落長來說明。
請一定要思考我一開始提到的問題:所謂"撥快一點"到底是什麼變快了?

延伸思考

為什麼某些遊戲要強調FPS是60?
明明電視的顯示頻率是30。(當然現在電視越來越好了,連240Hz的電視都有了)

某些神眼的玩家可以分辨出FPS 30的品質有間斷的感覺。
為什麼電影(30FPS)撥出的時候卻沒有這種感覺?

我要談FPS的原因是它比各位想像中都來得重要多了

不只是在刷新畫格上。

繼續前段的某狀況,有時候工人工作的快,有時候工人工作的慢。
意思是開發時的測試機器與最終使用者執行的機器效能不同,
甚至同一台機器效能也是變動的。
而且這問題也許不能只透過上面提到的控制播放的FPS方法來解決。
拿拍電影來舉例說明:

某電影場景拍攝內容是:"有台車自左邊跑到右邊,差點撞到過馬路的人"(遊戲內容),
在台灣拍的時候用的是普通裕隆轎車(硬體)。這場戲拍了10秒(跑到)。

現在好萊屋想要重拍這場電影,

內容當然是相同的:一台車自左邊跑到右邊,差點撞到過馬路的人
但是因為好萊屋比較有錢,找來的是一台保時捷。
保時捷一開3秒就跑到了,人都還沒過馬路,司機還跟你搖搖手說他已經很客氣。

解決方法是把3秒的畫格播慢一點讓他10秒才播完?
可是這樣做的時候卻發現過馬路的人也變慢動作,風吹的垃圾也變慢了。

所以,如果只是想要把車變慢,正確的做法應該是告訴司機,
第一畫格的時候你要開到哪個位置,讓攝影機拍一下。
第二畫格的時候則是第二位置,讓攝影機拍一下。
第三畫格的時候則是第三位置,讓攝影機拍一下。
直到10*30=第三百個畫格的時候要停在終點,讓攝影機拍一下。

遊戲設計是在每個畫格中進行。因此這邊說明的重點是:

在每個畫格必須知道這一格的結束時要進行多少的工作量,不可以做超過或短少。"

進一步說明
當我們拍攝電影時用30Hz拍。播放時就用30Hz來播。
3D Artist 拉了一個1秒的踢腿動作,當踢到0.5秒時,就一定要踢到一半。
企劃說飛越全地圖100單位要飛10秒。那麼飛到1秒的時候,飛機應該正在10的位置。
因此飛機速度應該是10 / 1 sec => (10/30) / 1 frame = 0.3 / 1 frame

10 / 1 sec : 這是企劃知道的速度
0.3 / 1 frame : 這才是本畫格真正的速度(移動量)
而因為這個數值FPS:30是變動的。
每個畫格的真正移動/變動量,要到該畫格才能知道。

至此,FPS扮演的角色,大家都應該很清楚了。

實務面是

在遊戲層的各個元件(不管是繪圖,移動,動畫)都要能取得目前FPS的資訊,
或是當此元件的機制需要這個資訊的時候,必須要從最外層一路傳進去。

延伸思考

當FPS因為某些狀況變低的時候(譬如說每秒10個畫格),
除了跳/飛快一點之外還能做甚麼?
當FPS因為某些狀況變得極端低的時候(譬如說每秒不到1個畫格),
會不會有甚麼例外狀況要特別注意?

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s